一) 其实这个功能在spring2x时代就提供了。一直没用过,今天在spring-mvc32x的环境下试验了一次。还算简单易用。
二) 依赖。
spring依赖POI或jExcel来实现对excel输出的支持,前者是apache出品,貌似名气更大,本例使用第一个。
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi</artifactId>
<version>37</version>
</dependency>
三) spring提供了一个AbstractExcelView作为自己实现的视图的父类。实例代码如下。
package yingcarview;
import javatextDateFormat;
import javatextSimpleDateFormat;
import javautilList;
import javautilMap;
import javaxservlet>
import javaxservlet>
import orgapachepoihssfusermodelHSSFDataFormat;
import orgapachepoihssfusermodelHSSFSheet;
import orgapachepoihssfusermodelHSSFWorkbook;
import orgapachepoissusermodelCell;
import orgapachepoissusermodelCellStyle;
import orgapachepoissusermodelIndexedColors;
import orgjodatimeDateTime;
import orgslf4jLogger;
import orgslf4jLoggerFactory;
import orgspringframeworkwebservletviewdocumentAbstractExcelView;
import yingcarbindingDateRange;
import yingcardomainRefuelingRecord;
public class RefuelingRecordExcelView extends AbstractExcelView {
private static final Logger LOGGER = LoggerFactorygetLogger(RefuelingRecordExcelViewclass);
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
@Override
@SuppressWarnings({"unchecked"})
protected void buildExcelDocument(
Map<String, Object> model, // MVC中的M就在这里了
HSSFWorkbook workbook,
>
>
{
("yyyy/MM/dd"));
LOGGERdebug("end: {}", new DateTime(drgetEnd())toString("yyyy/MM/dd"));
}
}
HSSFSheet sheet = workbookcreateSheet(DATE_FORMATformat(drgetStart()) + "-" + DATE_FORMATformat(drgetEnd()));
setColumnsWidth(sheet);
fillTableHeader(workbook, sheet);
fillTableBody(workbook, sheet, rrl);
}
private void setColumnsWidth(HSSFSheet sheet) {
final int[] warr = new int[] {
500, // <空>
4500, // 日期
4500, // 车辆
4500, // 燃油种类
4500, // 燃油单价
4500, // 加油方式
4500, // 加油量
3000, // 花费
12000 // 备注
};
for (int i = 0; i < warrlength; i ++) {
sheetsetColumnWidth(i, warr[i]);
}
}
// 填充表格头
private void fillTableHeader(HSSFWorkbook workbook, HSSFSheet sheet) {
final String[] contents = new String[] {
"日期",
"车辆",
"燃油种类",
"燃油单价(元/升)",
"加油方式",
"加油量(升)",
"花费(元)",
"备注"
};
int r = 1;
int c = 1;
CellStyle style = workbookcreateCellStyle();
stylesetFillForegroundColor(IndexedColorsYELLOWgetIndex()); // 填充**
stylesetFillPattern(CellStyleSOLID_FOREGROUND); // 填充方式
// 设置border
stylesetBorderLeft(CellStyleBORDER_THIN);
stylesetBorderRight(CellStyleBORDER_THIN);
stylesetBorderTop(CellStyleBORDER_THIN);
stylesetBorderBottom(CellStyleBORDER_THIN);
for (int i = 0; i < contentslength; i ++) {
Cell cell = getCell(sheet, r, c + i);
cellsetCellValue(contents[i]);
cellsetCellStyle(style);
}
}
private void fillTableBody(HSSFWorkbook workbook, HSSFSheet sheet, List<RefuelingRecord> records) {
// 通用style
CellStyle style = workbookcreateCellStyle();
stylesetFillForegroundColor(IndexedColorsWHITEgetIndex()); // 填充白色
stylesetFillPattern(CellStyleSOLID_FOREGROUND); // 填充方式
stylesetBorderLeft(CellStyleBORDER_THIN);
stylesetBorderRight(CellStyleBORDER_THIN);
stylesetBorderTop(CellStyleBORDER_THIN);
stylesetBorderBottom(CellStyleBORDER_THIN);
// 日期style
CellStyle dateStyle = workbookcreateCellStyle();
dateStylesetFillForegroundColor(IndexedColorsWHITEgetIndex()); // 填充白色
dateStylesetFillPattern(CellStyleSOLID_FOREGROUND); // 填充方式
dateStylesetBorderLeft(CellStyleBORDER_THIN);
dateStylesetBorderRight(CellStyleBORDER_THIN);
dateStylesetBorderTop(CellStyleBORDER_THIN);
dateStylesetBorderBottom(CellStyleBORDER_THIN);
dateStylesetDataFormat(HSSFDataFormatgetBuiltinFormat("m/d/yy"));
int r = 2;
int c = 1;
Cell cell = null;
for (int i = 0; i < recordssize(); i ++) {
RefuelingRecord rr = recordsget(i);
// 日期
cell = getCell(sheet, r, c + 0);
if (rrgetDate() != null)
cellsetCellValue(rrgetDate());
cellsetCellStyle(dateStyle);
// 车辆
cell = getCell(sheet, r, c + 1);
if (rrgetVehicle()getNickname() != null)
cellsetCellValue(rrgetVehicle()getNickname());
cellsetCellStyle(style);
// 燃油种类
cell = getCell(sheet, r, c + 2);
if (rrgetGasType() != null) {
String s = null;
switch (rrgetGasType()) {
case _0: s = "0号柴油"; break;
case _93: s = "93号汽油"; break;
case _97: s = "97号汽油"; break;
case _98: s = "98号汽油"; break;
}
cellsetCellValue(s);
}
cellsetCellStyle(style);
// 单价
cell = getCell(sheet, r, c + 3);
if (rrgetPriceOfGas() != null)
cellsetCellValue(rrgetPriceOfGas());
cellsetCellStyle(style);
// 加油方式
cell = getCell(sheet, r, c + 4);
if (rrgetRefuelingType() != null) {
String s = null;
switch (rrgetRefuelingType()) {
case FIXED_CUBAGE:
s = "固定容积"; break;
case FIXED_MONEY:
s = "固定金额"; break;
case FULL:
s = "加满"; break;
}
cellsetCellValue(s);
}
cellsetCellStyle(style);
// 加油量
cell = getCell(sheet, r, c + 5);
if (rrgetCubageOfGas() != null)
cellsetCellValue(rrgetCubageOfGas());
cellsetCellStyle(style);
// 花费
cell = getCell(sheet, r, c + 6);
if (rrgetSumOfMoney() != null)
cellsetCellValue(rrgetSumOfMoney());
cellsetCellStyle(style);
// 备注
cell = getCell(sheet, r, c + 7);
if (rrgetComment() != null)
cellsetCellValue(rrgetComment());
cellsetCellStyle(style);
r ++;
}
}
}
cellsetCellStyle(style);
// 燃油种类
cell = getCell(sheet, r, c + 2);
if (rrgetGasType() != null) {
String s = null;
switch (rrgetGasType()) {
case _0: s = "0号柴油"; break;
case _93: s = "93号汽油"; break;
case _97: s = "97号汽油"; break;
case _98: s = "98号汽油"; break;
}
cellsetCellValue(s);
}
cellsetCellStyle(style);
// 单价
cell = getCell(sheet, r, c + 3);
if (rrgetPriceOfGas() != null)
cellsetCellValue(rrgetPriceOfGas());
cellsetCellStyle(style);
// 加油方式
cell = getCell(sheet, r, c + 4);
if (rrgetRefuelingType() != null) {
String s = null;
switch (rrgetRefuelingType()) {
case FIXED_CUBAGE:
s = "固定容积"; break;
case FIXED_MONEY:
s = "固定金额"; break;
case FULL:
s = "加满"; break;
}
cellsetCellValue(s);
}
cellsetCellStyle(style);
// 加油量
cell = getCell(sheet, r, c + 5);
if (rrgetCubageOfGas() != null)
cellsetCellValue(rrgetCubageOfGas());
cellsetCellStyle(style);
// 花费
cell = getCell(sheet, r, c + 6);
if (rrgetSumOfMoney() != null)
cellsetCellValue(rrgetSumOfMoney());
cellsetCellStyle(style);
// 备注
cell = getCell(sheet, r, c + 7);
if (rrgetComment() != null)
cellsetCellValue(rrgetComment());
cellsetCellStyle(style);
r ++;
}
}
}
四) Controller中返回逻辑视图名 (代码片段)
Java代码
@RequiresUser // 安全框架用元注释
@RequiresRoles({"ROLE_USER"})
@RequestMapping(value = "/list/excel", method = RequestMethodGET)
public String listByExcel(
@DateRangeFormat(pattern = "yyyy-MM-dd") @RequestParam("dateRange") DateRange dateRange,
ModelMap modelMap
)
{
}
// 放入model
modelMapput("dateRange", dateRange);
modelMapput("refuelingRecordList", gasServicefindRefuelingRecordByDateRange(currentUserId, dateRange));
return "refueling-record-list"; // 最终返回逻辑视图名
}
五) 为spring-mvc配置多个视图解析器。
<bean class="orgspringframeworkwebservletviewXmlViewResolver">
<property name="order" value="1" /> <!-- order很重要 -->
<property name="location" value="classpath:/META-INF/viewsxml" />
</bean>
<bean class="orgspringframeworkwebservletviewInternalResourceViewResolver">
<property name="order" value="9999" />
<property name="viewClass" value="orgspringframeworkwebservletviewJstlView" />
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value="jsp"/>
六) 效果图
quartz定时任务配置:
class="orgschelingquartz"
其中:
配置对应的定时任务,可配置多个,名称要唯一,对应的是第二步中配置的
配置,由于要实现动态读取定时任务周期时间,所以我们要写一个类实现,类的内容如下:
publicclassextendsimplements{
privatestaticfinallong=1L;
privatesysParamServiceImpl;
privateStringkey;
publicvoidsetKey(Stringkey)
{
thiskey=key;
}
publicvoidsetSysParamServiceImpl(SysParamServiceImplsysParamServiceImpl)
{
thissysParamServiceImpl=sysParamServiceImpl;
setCronExpression(getCronExpressionFromDB());
}
privateStringgetCronExpressionFromDB()
{
if(StringUtilsisEmpty(key))
return"000/1";
SysParamsysParam=newSysParam();
try
{
sysParam=sysParamServiceImplgetNameByKey(key);
}
catch(Exceptione)
{
eprintStackTrace();
}
if(sysParam!=null&&!StringUtilsisEmpty(sysParamgetParamValue()))
returnsysParamgetParamValue();
return"000/1";
}
}
简单说明一下:key是用来查询数据库配置的CronExpression表达式的查询条件,SysParamServiceImpl是实现查询的类,这几个参数都要从spring配置的CronTriggerFactoryBean参数获取,注意,配置的时候,key值的配置要在SysParamServiceImpl的配置之前,否则报空指针
spring配置CronTriggerFactoryBean:
实现了CronTriggerFactoryBean之后,开始配置CronTriggerFactoryBean,现在配置的是InitCronTriggerFactoryBean:
id对应quartz定时任务配置的,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个则是定时任务执行业务逻辑的类
ps:,这个要配置对应的bean,我的是
配置对应的定时任务执行业务方法的类:
class="orgspringframeworkschelingquartzJobDetailFactoryBean"
简单说明一下:配置的是你需要定时执行的类,下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。
对应的定时任务执行类:
publicclassInquiryQuartzextendsQuartzJobBean{
@Autowired
privateInquiryServiceImplinquiryServiceImpl;
@Override
protectedvoidexecuteInternal(JobExecutionContextarg0)throwsJobExecutionException
{
//实例化接口
inquiryServiceImpl=(InquiryServiceImpl)arg0getJobDetail()getJobDataMap()get("inquiryServiceImpl");
//执行业务方法
quartzStart();
}
publicvoidquartzStart(){
//业务方法
}
}
说明一下:必须要实现QuartzJobBean接口
至此,就可以完成可配置CronExpression表达式的定时任务了!1
以上就是关于spring中配置MySql数据源,怎样配置数据库信息全部的内容,包括:spring中配置MySql数据源,怎样配置数据库信息、Spring Boot教程第5篇:beatsql、springboot连接阿里云数据库读取不到数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)