基于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. Gradle使用国内的maven仓库

    本文转载自:https://www.cnblogs.com/yoyotl/p/6291703.html 感谢阿里云! 找到gradle的配置文件路径,例如Windows中的路径为C:\Users\${ ...

  2. 2018-2019-1 20165226《信息安全系统设计基础》 pwd命令的实现

    2018-2019-1 20165226<信息安全系统设计基础> pwd命令的实现 一.学习pwd 查看pwd 得知一个嫩过去文件路径的函数--getcwd i节点值 通过ls -i -a ...

  3. 汇编_指令_SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR

    ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shif ...

  4. WebFrom基础

    ASP.NET WebForm C/S B/S客人 - 用户 要土豆丝 - 给IIS发送请求 ,IIS就相当于是服务员 通知厨房 - IIS把用户要想看到的ASPX告知.NET框架 厨房炒菜 - .n ...

  5. Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台)

    ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台) 机器学习平台 一站式可视化机器学习 https://pai.cloud.ali ...

  6. 【失败】CentOS 6.5安装VNCserver 并开启远程桌面

    如果你的centos系统压根就没装CDE.Gnome等桌面,那你先执行这条命令,把GUI环境装上,no GUI no VNC yum -y groupinstall 'GNOME Desktop En ...

  7. python 构造mysql爆破器

    前言: 今天已经期末考完,睡了个觉起床写了个 mysql爆破器. 思路: 1.爆破用户->用户存在的话不会报错反之报错 2.爆破密码->密码正确不会报错反之报错 3.用户名和密码一起爆破- ...

  8. React-Todos

    最近学完React的最基本概念,闲下来的时候就自己写了一个Todo-List的小应用.这里做个简略的说明,给想好好学React的新手看. React-Todo 学习前提 这里我用了webpackb做了 ...

  9. 人脸识别-<转>

    人脸检测库libfacedetection介绍 libfacedetection是于仕琪老师放到GitHub上的二进制库,没有源码,它的License是MIT,可以商用.目前只提供了windows 3 ...

  10. iframe 元素会创建包含另外一个文档的内联框架(即行内框架)

    HTML 与 XHTML 之间的差异 在 HTML 4.1 Strict DTD 和 XHTML 1.0 Strict DTD 中,不支持 iframe 元素. 提示和注释: 提示:您可以把需要的文本 ...