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

  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.  
  3. 2.代码:
    2.1业务类:
  1. /**
    * 目标sheet索引
    */
    String TARGET_SHEET_INDEX = "_targetSheetIndex";
  2.  
  3. /**
    * 目标sheet名称
    */
    String TARGET_SHEET_NAME = "_targetSheetName";
  1. 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();
    }
    }
    }
  1.  
  2. 2.2工具类
  1. public class JxlsUtil {
  2.  
  3. private static final Logger logger = LoggerFactory.getLogger(JxlsUtil.class);
  4.  
  5. static {
    // 添加自定义指令
    XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
    }
  6.  
  7. /**
    * jxls模版文件目录
    */
    private final static String TEMPLATE_PATH = "templates";
  8.  
  9. /**
    * 导出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);
  10.  
  11. AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
    List<Area> areaList = areaBuilder.build();
    Area area = areaList.get(0);
    // 定义上下文
    Context context = new PoiContext(beans);
    // 设置不处理公式
    context.getConfig().setIsFormulaProcessingRequired(false);
  12.  
  13. 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";
    }
  14.  
  15. area.applyAt(new CellRef((String) targetSheetName), context);
    // 强制重新计算公式
    workbook.setForceFormulaRecalculation(true);
    // 定位到第一个sheet
    workbook.setActiveSheet((Integer) targetSheetIndex);
  16.  
  17. // 删除模板sheet
    workbook.removeSheetAt(0);
    // 输出文件
    ((PoiTransformer) transformer).getWorkbook().write(os);
    }
  18.  
  19. /**
    * 导出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);
  20.  
  21. AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
    List<Area> areaList = areaBuilder.build();
    Area area = areaList.get(0);
    // 定义上下文
    Context context = new PoiContext(beans);
    // 设置不处理公式
    context.getConfig().setIsFormulaProcessingRequired(false);
  22.  
  23. 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";
    }
  24.  
  25. area.applyAt(new CellRef((String) targetSheetName), context);
    // 强制重新计算公式
    workbook.setForceFormulaRecalculation(true);
    // 定位到第一个sheet
    workbook.setActiveSheet((Integer) targetSheetIndex);
  26.  
  27. // 删除模板sheet
    workbook.removeSheetAt(0);
  28.  
  29. //临时输出excel文件
    File file = new File(excelTmpDir + fileName);
    FileOutputStream fileOutputStream = null;
  30.  
  31. fileOutputStream = new FileOutputStream(file);
    ((PoiTransformer) transformer).getWorkbook().write(fileOutputStream);
  32.  
  33. fileOutputStream.close();
  34.  
  35. } 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;
    }
  36.  
  37. /**
    * 导出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);
    }
  38.  
  39. String tempPath = checkTempFolder() + UUID.randomUUID();
    File file = new File(tempPath);
    logger.info("Saving temp excel file to {}.", file.getAbsolutePath());
    OutputStream os = new FileOutputStream(file);
  40.  
  41. 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);
  42.  
  43. 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);
  44.  
  45. return ExcelFileReadUtil.readExcelFile2007(new FileInputStream(file));
    }
  46.  
  47. /**
    * 本地临时目录
    *
    * @return 本地临时目录
    */
    private static String checkTempFolder() {
    String temporaryPath = TemporaryPathUtil.getGlobalTempPathStr() + "ExcelTemp/";
    File saveFolder = new File(temporaryPath);
    if (!saveFolder.exists()) {
    boolean mkdirs = saveFolder.mkdirs();
    }
    return temporaryPath;
    }
  48.  
  49. /**
    * 导出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);
    }
    }
  50.  
  51. /**
    * 导出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();
    }
    }
  52.  
  53. /**
    * 导出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);
    }
    }
  54.  
  55. /**
    * 导出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);
    }
    }
  56.  
  57. /**
    * 获取模板文件
    *
    * @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;
    }
  58.  
  59. /**
    * 删除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();
    }
    }
    }
  1. 3.模板文件的定义:注意定义的区域要比模板的区域要大,否则会报错

  1.  
  1.  

报表导出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. web开发,click,touch,tap事件浅析

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  2. linux版飞信安装

    下载安装包; http://www.it-adv.net/fetion/libraryrh4x32.tar.gz  [支持库] http://www.it-adv.net/fetion/downloa ...

  3. centos7使用tinyproxy搭建简单http(s)服务器,无用户密码验证

    1  安装 yum install tinyproxy 2 查找配置文件地址 whereis tinyproxy.conf 3 编辑配置文件 vim tinyproxy.conf 把 allow 12 ...

  4. python中字典的比较

    今天碰到一个字典比较的问题,就是比较两个字典的大小,其实这个用的不多,用处也没多少,但是还是记录一下. 字典的比较顺序如下: 1.先比较字典的元素的个数,那个多,就哪个大: 2.比较字典的键,在比较字 ...

  5. leetcode507

    public class Solution { public bool CheckPerfectNumber(int num) { ) { return false; } ; ; i <= nu ...

  6. How To Manually Install Oracle Java on Ubuntu

    Introduction Java is a programming technology originally developed by Sun Microsystems and later acq ...

  7. Git----时光穿梭机之撤销修改05

    自然,你是不会犯错,不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: $ cat readme.txtGit is a distributed version cont ...

  8. Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

    问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varchar,字符编码utf-8.部分插入成功,部分插入失败,报错如标题. 在网上查询,有人说是编码问题,建议修改编码格式,比如改 ...

  9. Navigation and Pathfinding

    [Navigation and Pathfinding] 术语: 1)NavMesh 2)NavMesh Agent 3)Off-Mesh Link 4)NavMesh Obstacle A comm ...

  10. SAP middb主键加索引

    alter table DEPTBIGCPDL_DBC drop constraint DEPTBIGCPDL_DBC_PK CREATE UNIQUE INDEX TABLEAU_USER.DEPT ...