基于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. Spark系列(二) Spark Shell各种操作及详细说明

    并行化scala集合(Parallelize) //加载数据1~10 val num=sc.parallelize(1 to 10) //每个数据项乘以2,注意 _*2记为一个函数(fun) val ...

  2. html链接路径

    html链接的相对路径与绝对路径 绝对路径 完整的一个路径就是绝对路径,即包含schema://host[:port#]/path/.../[?query-string][#anchor] 例:htt ...

  3. Java API token定时刷新

    主要用到了调度线程池: ScheduleExecutorService, 一个循环方法scheduleWithFixedDelay(方法执行完之后计算下一次开始执行时间) 使用 TokenManage ...

  4. zookeeper 分布式计数器

    分布式计数器的思路是:指定一个Zookeeper数据节点作为计数器,多个应用实例在分布式锁的控制下,通过更新该数据节点的内容来实现计数功能. Curator中封装了实现,例如 DistributedA ...

  5. SpringMVC 学习笔记(处理器映射器的配置)

    前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...

  6. 记一次结巴分词.net core 2.0版 nuget发布过程

    最近用到分词考虑很久,选用了结巴分词,原因见博客Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考 既然选好了,难就开始行动吧 . 查了.ne ...

  7. 在MetaFile里放图片

    procedure TForm1.Button1Click(Sender: TObject); var m : TmetaFile; mc : TmetaFileCanvas; b : tbitmap ...

  8. Linux系统下使用ckfinder上传中文名的图片无法正常预览

    问题描述:使用ckfinder上传带有中文名称的图片后在Windows本地可以正常预览,部署在Linux系统后,带有中文名的图片不能正常显示 解决办法:找到Tomcat的根目录 --> conf ...

  9. Frequently Used Shell Commands

    [Common Use Shell Commands] 1.ps aux:查看当前所有进程 ,以用户名为主键.可以查看到 USER.PID.COMMAND(binary所有位置) 2.netstat ...

  10. MongoDB 自动分片 auto sharding

    MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也 ...