基于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. Java LinkedList 和 ArrayList

    Java 手册 java.util 类 ArrayList<E> java.lang.Object java.util.AbstractCollection<E> java.u ...

  2. MySQL 高性能存储引擎:TokuDB初探

    在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduDB做一个初步的整理,使用后再做更多的分享. 什么是TokuDB? 在MySQL最流行的支持全事务的引擎为 ...

  3. Solr中Facet用法和Group用法

    Group分组划分结果,返回的是分组结果: Facet分组统计,侧重统计,返回的是分组后的数量: 一.Group用法: //组查询基础配置params.set(GroupParams.GROUP, & ...

  4. Thymeleaf系列五 迭代,if,switch语法

      1. 概述 这里介绍thymeleaf的编程语法,本节主要包括如下内容 迭代语法:th:each; iteration status 条件语法:th:if; th:unless switch语法: ...

  5. to_char 函数将小数点舍掉的解决办法

    to_char(val,'0.9') 9 代表一个数字 0 强制显示0 $ 放置一个$符 L 放置一个浮动本地货币符 . 显示小数点 , 显示千位指示符

  6. MPI 计时器函数 MPI_Wtime()

    ▶ 计时器函数 MPI_Wtime() 以及头文件 timer.h 中的宏函数 GET_TIME(),类似 time.h 中函数 clock() 的用法.注意 函数 clock() 记录的是CPU时间 ...

  7. 关于javascript中的typeof和instanceof介绍

    typeof用来检测给定变量的数据类型 instanceof用来检测对象的类型 typeof用来检测给定变量的数据类型(也可叫做基本类型,基本数据类型.包含undefined.boolean.stri ...

  8. Access空字符串和Null值

    什么是空字符串和Null值: Microsoft Access可以区分两种类型的空值.因为在某些情况下,字段为空,可能是因为信息目前无法获得,或者字段不适用于某一特定的记录.例如,表中有一个“电话号码 ...

  9. Maven(九)”编码 gbk 的不可映射字符“ 问题解决方案

    解决这个问题的思路: 在maven的编译插件中声明正确的字符集编码编码——编译使用的字符集编码与代码文件使用的字符集编码一致!! 安装系统之后,一般中文系统默认字符集是GBK.我们安装的软件一般都继承 ...

  10. gain 基尼系数

    转至:http://blog.csdn.net/bitcarmanlee/article/details/51488204 在信息论与概率统计学中,熵(entropy)是一个很重要的概念.在机器学习与 ...