基于poi的jxls工具的使用:
1.依赖:

<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.16</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
</exclusions>
</dependency> 2.代码:
2.1业务类:
/**
* 目标sheet索引
*/
String TARGET_SHEET_INDEX = "_targetSheetIndex"; /**
* 目标sheet名称
*/
String TARGET_SHEET_NAME = "_targetSheetName";
public void exportFile(HttpServletResponse response) throws  Exception {
// 获取模板目录
String templateFilePath = OrdersExportTemplateFilePath;
if (StringUtils.isEmpty(templateFilePath)) {
}
templateFilePath = templateFilePath.trim();
InputStream fileInputStream = null;
try {
// 读取文件
fileInputStream = FileReader.readFile(templateFilePath);
String fileNameWithPrefix ="渠道分析报表"+"-"+ DateUtil.getDateTimeStrT(new Date()) +".xlsx";
String mimeType = URLConnection.guessContentTypeFromName(fileNameWithPrefix);
if (mimeType == null) {
//unknown mimetype so set the mimetype to application/octet-stream
mimeType = "application/octet-stream;charset=UTF-8";
}
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileNameWithPrefix,"UTF-8") );
// 查询数据
List<BaiduTongjiData> list = getStatisticsData("20190401","20190501");
// 导出
Map<String, Object> beans = new HashMap<>();
// 目标sheet名称
beans.put(UtilKeyName.TARGET_SHEET_NAME, "订单导出列表!A1");
// 目标sheet索引
beans.put(UtilKeyName.TARGET_SHEET_INDEX, 1);
beans.put("data", list);
beans.put("indexUpdater", new OrderExportCellUpdater.IndexCellUpdater());
JxlsUtil.exportExcel(fileInputStream, response.getOutputStream(), beans);
} finally {
if (fileInputStream != null) {
fileInputStream.close();
}
}
}

2.2工具类
public class JxlsUtil {

    private static final Logger logger = LoggerFactory.getLogger(JxlsUtil.class);

    static {
// 添加自定义指令
XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
} /**
* jxls模版文件目录
*/
private final static String TEMPLATE_PATH = "templates"; /**
* 导出Excel
*
* @param is 模板文件输入流
* @param os 生成文件输出流
* @param beans 填充数据
* @throws IOException IO异常
*/
public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> beans) throws IOException, InvalidFormatException {
if (beans == null) {
return;
}
Workbook workbook = WorkbookFactory.create(is);
// setting rowAccessWindowSize to 600 to be able to process static cells in a single iteration
Transformer transformer = PoiTransformer.createSxssfTransformer(workbook, 600, true);
// 不打印警告信息
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
evaluator.getJexlEngine().setSilent(true); AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> areaList = areaBuilder.build();
Area area = areaList.get(0);
// 定义上下文
Context context = new PoiContext(beans);
// 设置不处理公式
context.getConfig().setIsFormulaProcessingRequired(false); Object targetSheetName = beans.get(UtilKeyName.TARGET_SHEET_NAME);
if (targetSheetName == null) {
logger.warn("Could not find 'TARGET_SHEET_NAME' in beans,set to empty String.");
targetSheetName = "";
}
Object targetSheetIndex = beans.get(UtilKeyName.TARGET_SHEET_INDEX);
if (targetSheetIndex == null) {
logger.warn("Could not find 'TARGET_SHEET_INDEX' in beans,set to 1.");
targetSheetIndex = "1";
} area.applyAt(new CellRef((String) targetSheetName), context);
// 强制重新计算公式
workbook.setForceFormulaRecalculation(true);
// 定位到第一个sheet
workbook.setActiveSheet((Integer) targetSheetIndex); // 删除模板sheet
workbook.removeSheetAt(0);
// 输出文件
((PoiTransformer) transformer).getWorkbook().write(os);
} /**
* 导出Excel压缩包
*
* @param is 模板文件输入流
* @param fileName 唯一标志
* @param beans 填充数据
* @param excelTmpDir 导出excel文件的临时目录
* @throws IOException IO异常
*/
public static boolean createExcel(InputStream is, Map<String, Object> beans, String fileName, String excelTmpDir) {
if (beans == null) {
return false;
}
Workbook workbook = null;
try {
workbook = WorkbookFactory.create(is);
// setting rowAccessWindowSize to 600 to be able to process static cells in a single iteration
Transformer transformer = PoiTransformer.createSxssfTransformer(workbook, 600, true);
// 不打印警告信息
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
evaluator.getJexlEngine().setSilent(true); AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> areaList = areaBuilder.build();
Area area = areaList.get(0);
// 定义上下文
Context context = new PoiContext(beans);
// 设置不处理公式
context.getConfig().setIsFormulaProcessingRequired(false); Object targetSheetName = beans.get(UtilKeyName.TARGET_SHEET_NAME);
if (targetSheetName == null) {
logger.warn("Could not find 'TARGET_SHEET_NAME' in beans,set to empty String.");
targetSheetName = "";
}
Object targetSheetIndex = beans.get(UtilKeyName.TARGET_SHEET_INDEX);
if (targetSheetIndex == null) {
logger.warn("Could not find 'TARGET_SHEET_INDEX' in beans,set to 1.");
targetSheetIndex = "1";
} area.applyAt(new CellRef((String) targetSheetName), context);
// 强制重新计算公式
workbook.setForceFormulaRecalculation(true);
// 定位到第一个sheet
workbook.setActiveSheet((Integer) targetSheetIndex); // 删除模板sheet
workbook.removeSheetAt(0); //临时输出excel文件
File file = new File(excelTmpDir + fileName);
FileOutputStream fileOutputStream = null; fileOutputStream = new FileOutputStream(file);
((PoiTransformer) transformer).getWorkbook().write(fileOutputStream); fileOutputStream.close(); } catch (FileNotFoundException e) {
logger.info("order export cause an fileNotFoundException:{}", e);
return false;
} catch (IOException e) {
logger.info("order export cause an IOException:{}", e);
return false;
} finally {
try {
is.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
return true;
} /**
* 导出Excel核心逻辑
* <p>TODO 能不能不保存到磁盘,直接填充模板返回WorkBook
*
* @param is 模板文件输入流
* @param beans 数据
* @return 处理完成的Workbook
* @throws IOException 读取模板文件时的IO异常
*/
private static Workbook exportCore(InputStream is, Map<String, Object> beans) throws IOException {
if (beans == null) {
return null;
}
//....
if (StringUtils.isBlank(beans.get(UtilKeyName.TARGET_SHEET_NAME) + "")) {
// 目标sheet名称
logger.warn("Could not find 'TARGET_SHEET_NAME' in beans,set to empty String.");
beans.put(UtilKeyName.TARGET_SHEET_NAME, "");
}
if (StringUtils.isBlank(beans.get(UtilKeyName.TARGET_SHEET_INDEX) + "")) {
// 目标sheet索引
logger.warn("Could not find 'TARGET_SHEET_INDEX' in beans,set to 1.");
beans.put(UtilKeyName.TARGET_SHEET_INDEX, 1);
} String tempPath = checkTempFolder() + UUID.randomUUID();
File file = new File(tempPath);
logger.info("Saving temp excel file to {}.", file.getAbsolutePath());
OutputStream os = new FileOutputStream(file); Workbook workbook = WorkbookFactory.create(is);
// setting rowAccessWindowSize to 600 to be able to process static cells in a single iteration
Transformer transformer = PoiTransformer.createSxssfTransformer(workbook);
// 不打印警告信息
// JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
//evaluator.getJexlEngine().setSilent(true); AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> areaList = areaBuilder.build();
Area area = areaList.get(0);
// 定义上下文
Context context = new PoiContext(beans);
// 设置不处理公式
context.getConfig().setIsFormulaProcessingRequired(false);
area.applyAt(new CellRef((String) beans.get(UtilKeyName.TARGET_SHEET_NAME)), context);
// 强制重新计算公式
workbook.setForceFormulaRecalculation(true);
// 定位到第一个sheet
workbook.setActiveSheet((Integer) beans.get(UtilKeyName.TARGET_SHEET_INDEX));
// 删除模板sheet
workbook.removeSheetAt(0);
// 输出文件
Workbook targetWookbook = ((PoiTransformer) transformer).getWorkbook();
targetWookbook.write(os); return ExcelFileReadUtil.readExcelFile2007(new FileInputStream(file));
} /**
* 本地临时目录
*
* @return 本地临时目录
*/
private static String checkTempFolder() {
String temporaryPath = TemporaryPathUtil.getGlobalTempPathStr() + "ExcelTemp/";
File saveFolder = new File(temporaryPath);
if (!saveFolder.exists()) {
boolean mkdirs = saveFolder.mkdirs();
}
return temporaryPath;
} /**
* 导出Excel
* <p>注意:会关闭流
*
* @param xlsxFilePath 模板文件路径
* @param beans 填充数据
* @throws IOException IO异常
*/
public static Workbook exportExcel(String xlsxFilePath, Map<String, Object> beans) throws IOException {
try (InputStream inputStream = FileReader.readFile(xlsxFilePath)) {
return exportCore(inputStream, beans);
}
} /**
* 导出Excel
* <p>注意:会关闭流
*
* @param inputStream 模板文件输入流
* @param beans 填充数据
* @throws IOException IO异常
*/
public static Workbook exportExcel(InputStream inputStream, Map<String, Object> beans) throws IOException {
try {
return exportCore(inputStream, beans);
} finally {
inputStream.close();
}
} /**
* 导出Excel
*
* @param xlsPath 模板文件路径
* @param outPath 生成文件路径
* @param beans 填充数据
* @throws IOException IO异常
*/
public static void exportExcel(String xlsPath, String outPath, Map<String, Object> beans) throws IOException, InvalidFormatException {
String absolutePath = new File(xlsPath).getAbsolutePath();
try (InputStream is = FileReader.readFile(xlsPath); OutputStream os = new FileOutputStream(outPath)) {
exportExcel(is, os, beans);
}
} /**
* 导出Excel
*
* @param xlsFile 模板文件
* @param outFile 生成文件
* @param beans 填充数据
* @throws IOException IO异常
*/
public static void exportExcel(File xlsFile, File outFile, Map<String, Object> beans) throws IOException, InvalidFormatException {
try (InputStream is = new FileInputStream(xlsFile); OutputStream os = new FileOutputStream(outFile)) {
exportExcel(is, os, beans);
}
} /**
* 获取模板文件
*
* @param fileName 模板文件名
* @return 模板文件
*/
public static File getTemplateFile(String fileName) {
URL resourceUrl = JxlsUtil.class.getClassLoader().getResource(TEMPLATE_PATH);
if (resourceUrl == null) {
return null;
}
String templateFilePath = resourceUrl.getPath();
File templateFile = new File(templateFilePath, fileName);
return templateFile.exists() ? templateFile : null;
} /**
* 删除07以上excel文件的工作表
*
* @param xlsFile 文件
* @param sheetIndex 要删除的sheet的索引
* @throws IOException
*/
public static void deleteXSSFSheet(File xlsFile, int sheetIndex) throws IOException {
InputStream is = new FileInputStream(xlsFile);
XSSFWorkbook workbook = new XSSFWorkbook(is);
OutputStream os = new FileOutputStream(xlsFile);
try {
workbook.removeSheetAt(sheetIndex);
workbook.write(os);
} finally {
is.close();
os.close();
}
}
}
3.模板文件的定义:注意定义的区域要比模板的区域要大,否则会报错


												

报表导出jxls的使用笔记的更多相关文章

  1. 【HOW】如何限制Reporting Services报表导出功能中格式选项

    Reporting Services报表导出功能中缺省会提供多种导出格式选项,但很多情况下不需要全部的格式选项,因此需要对这些选项进行限制.下面我们以SQL Server 2008 R2为例来说明对这 ...

  2. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  3. Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm

    Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...

  4. kettle工具实现报表导出的初步搭建

    1.下载kettle 国外网站:http://kettle.pentaho.org/需要FQ,下载慢 2.下载完成启动(windows)-->spoon.bat 3.进入界面,两个主要的tab页 ...

  5. Dynamics CRM 报表导出EXCEL 列合并问题的解决方法

    CRM中的报表导出功能提供了多种格式,excel就是其中之一,这次遇到的问题是导出后打开excel列明合并的问题,具体如下看着相当不美观,物料名称字段占了AB两列,品牌占了CD两列等等. 该问题的源头 ...

  6. 考勤输入导入OA平台与考勤统计报表导出功能源代码

    注:以某某公司为例,每日签到时间为8点整   每日签退时间为17点30分 规则:公司签到签退时间在OA平台中可以视实际情况调整,当天有请假并通过工作流审批通过为有效,当天因公外出并通过工作流审批通过为 ...

  7. ActiveReports 报表应用教程 (16)---报表导出

    葡萄城ActiveReports报表支持多种格式的报表导出,包括PDF.Excel.Word.RTF.HTML.Text.TIFF以及其它图片格式,用户可以将它们应用到Windows Forms.We ...

  8. 填报表导出excel非可写单元格锁定问题

     问题描述: 填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对 ...

  9. 报表导出excel方式介绍

     报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...

随机推荐

  1. 常用数据结构的功能及复杂度总结(OI)

    不定长数组 维护一个序列 在末尾插入/删除均摊O(1) 任意位置插入O(n) 指定位置查询/修改O(1) 空间O(n) 链表 维护一个序列 定位到第i个位置O(n) 在任意位置(已定位到该位置)插入/ ...

  2. Ubuntu 升级内核版本

    查看当前内核版本 sch01ar@ubuntu:~$ uname -r Ubuntu 内核地址:https://kernel.ubuntu.com/~kernel-ppa/mainline/ 打开这个 ...

  3. C关系运算结果及逻辑运算结果保存

    http://service.exmail.qq.com/

  4. django2.0数据展示流程

    之前刚刚实现了数据添加的流程,那么数据展示是怎么回事 1 先在 views.py 中定义函数 增加获取数据的方式 from django.shortcuts import render from bl ...

  5. [think\exception\ErrorException] glob() has been disabled for security reasons

    今天同事开发 出现了这个错误 [think\exception\ErrorException] glob() has been disabled for security reasons 打开php. ...

  6. Spring-Boot devtools项目自动重启

    配置#use shutdown curl -X POST -i 'http://127.0.0.1:8080/actuator/shutdown'management.endpoints.web.ex ...

  7. Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件

    用ant和xdoclet生成hibernate配置文件可以为我们省去很多配置的操作,废话不多说,直接给栗子: 测试环境: eclipse:Eclipse Java EE IDE for Web Dev ...

  8. Mysql 查询列名

    #列名 select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA='yunpiaobox_db' and table_ ...

  9. MyBait 符号大于 小于理解

    EQ 就是 EQUAL等于 NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL ...

  10. STL string 常用函数(转)

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...