2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > java-EasyExcel导出excel设置单元格为文本格式(含代码)

java-EasyExcel导出excel设置单元格为文本格式(含代码)

时间:2019-10-31 01:29:01

相关推荐

java-EasyExcel导出excel设置单元格为文本格式(含代码)

java-EasyExcel导出excel设置单元格为文本格式(含代码)

在使用EasyExcel导出excel模板时。我们会发现导出的日期和大长度数字都会自动更换格式,不是文本格式。并且在空白单元格输入日期也是格式有问题的,如下所示,可以看到当输入相同的日期时,格式会变成自适应,不是文本格式了,所以我们需要从代码里设置,导出表格的单元格固定是文本(我的项目中使用EasyExcel是2.0+的版本,不同版本可能代码实现是不同的,但是原理都是一样的)。

一、设置空白单元格的格式为文本

新建一个handler实现SheetWriteHandler接口,在创建单元格时设置格式为文本

public class CustomSheetWriteHandler implements SheetWriteHandler {// 设置100列columnprivate static final Integer COLUMN = 100;@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {for (int i = 0; i < COLUMN; i++) {// 设置为文本格式SXSSFSheet sxssfSheet = (SXSSFSheet) writeSheetHolder.getSheet();CellStyle cellStyle = writeWorkbookHolder.getCachedWorkbook().createCellStyle();// 49为文本格式cellStyle.setDataFormat((short) 49);// i为列,一整列设置为文本格式sxssfSheet.setDefaultColumnStyle(i, cellStyle);}}}

二、设置含有数据的单元格的格式为文本

因为在自己的项目中发现,如果只是完成上面第一步,会发现导出的模板中,含有数据的单元格的格式还是常规,当重新输入后,日期又自适应,变成不是文本字符串了,所以我这里还是设置了含有数据的单元格的格式为文本

只需要在导出模板的实体类的字段上加上注解即可:@ContentStyle(dataFormat = 49)

@Datapublic class ExpenseTemplateModel {/*** 所属年月*/@HeadFontStyle(color= 10)@ExcelProperty(value = "所属年月")@ContentStyle(dataFormat = 49)private String expenseMonth;/*** 会计主体*/@HeadFontStyle(color= 10)@ExcelProperty(value = "会计主体")@ContentStyle(dataFormat = 49)private String borrowerName;/*** 凭证号*/@HeadStyle(fillForegroundColor = 22)@ExcelProperty(value = "凭证号")@ContentStyle(dataFormat = 49)private String voucherNo;/*** 摘要*/@HeadFontStyle(color= 10)@ExcelProperty(value = "摘要")private String summary;/*** 科目*/@HeadFontStyle(color= 10)@ExcelProperty(value ="科目")private String subjectName;/*** 部门*/@HeadFontStyle(color= 10)@ExcelProperty(value ="部门")private String orgName;/*** 人员*/// @HeadFontStyle(color= 10)@HeadStyle(fillForegroundColor = 22)@ExcelProperty(value ="人员")private String personnel;/*** 金额*/@HeadFontStyle(color= 10)@ExcelProperty(value ="金额")@ContentStyle(dataFormat = 49)private String amount;/*** ID号*/@HeadStyle(fillForegroundColor = 22)@ExcelProperty(value ="ID号")@ContentStyle(dataFormat = 49)private String idNo;/*** 调整类型*/@HeadStyle(fillForegroundColor = 22)@ExcelProperty(value ="调整类型")private String remark;}

三、在导出模板注册第一步新建的handler类

.registerWriteHandler(new CustomSheetWriteHandler())

下面是导出模板的实现类,用于测试:

public void downloadOtherExpenseTemplate(HttpServletResponse response) {List<Remark> remarks = remarkService.listAll(new RemarkQueryBo());List<ExpenseTemplateModel> expenseTemplateModels = new ArrayList<>();// 添加样例数据ExpenseTemplateModel expenseTemplateModel = new ExpenseTemplateModel();expenseTemplateModel.setExpenseMonth("-09");expenseTemplateModel.setBorrowerName("测试有限公司1");expenseTemplateModel.setSummary("测试用情况");expenseTemplateModel.setSubjectName("测试经费");expenseTemplateModel.setOrgName("测试会");expenseTemplateModel.setPersonnel("张达达");expenseTemplateModel.setAmount("300");expenseTemplateModels.add(expenseTemplateModel);OutputStream outputStream = null;try {String fileName = "测试模板";outputStream = response.getOutputStream();response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));EasyExcel.write(outputStream, ExpenseTemplateModel.class).autoCloseStream(true).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new CustomSheetWriteHandler()).sheet(fileName).doWrite(expenseTemplateModels);} catch (IOException e) {throw new ResultException("导出excel异常: " + e.getMessage());} finally {IOUtils.closeQuietly(outputStream);}}

可以看到导出的模板每个单元格的格式都是文本了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。