说明:本人最近在着手实现导出日志数据,由于日志数据过多,在网上查找java 导出大量数据到excel的例子。

后发现园子里某位老哥通过StringTemplate模板生成excel格式的xml,这个思路令我大为惊奇。

在融入到自己的项目后,发现wps可以正常打开生成的文件,但excel2019无法打开。

通过各种测试,后发现一种方法能解决这个问题。

老哥原文链接:【https://www.cnblogs.com/barrywxx/p/10700283.html】

没看过的先看看老哥的思路。

我这里只针对excel无法打开生成的文件做解决说明

第一步:列数写为固定的16384

    /***
* 写入excel文件数据信息
* 一页写入
*/
public <T> void writeExcelOneSheetData(String sheetName, List<T> dataList) {
// 写入excel文件数据信息
// 列数
StringTemplate body = stGroup.getInstanceOf(templateSuffix + "body");
Worksheet worksheet = new Worksheet();
worksheet.setSheet(sheetName);
     // 最重要的是这一行,将列数写为固定的16384,别问为什么,我也不知道!
worksheet.setColumnNum(16384);
worksheet.setRowNum(dataList.size() + 10);
worksheet.setRows(dataList);
body.setAttribute("worksheet", worksheet);
this.writer.print(body.toString());
this.writer.flush();
worksheet = null;
body = null;
Runtime.getRuntime().gc();
}

第二步:生成的文件后缀使用xls,不要使用xlsx。

而后使用excel打开,会弹出文件不安全提示,问是否继续打开?点击是。问题完美解决!

期间还试过对内容里的特殊符号进行转译处理,后来发现不用转译也能正常显示。不过还是把转译的贴出来,需要自取:

    public static String xmlTranslation(String s) {
// 写之前对特殊字符串进行转义
//&lt; <
// &gt; >
// &amp; &
// &apos; '
// &quot; "
s = s.replace("&", "&amp;");
s = s.replace("<", "&lt;");
s = s.replace(">", "&gt;");
s = s.replace("'", "&apos;");
s = s.replace("\"", "&quot;");
return s;
}

这是我的完整代码,有需要自取:

package com.hz.plat.common.util;

import com.hz.plat.common.entity.Worksheet;
import lombok.extern.slf4j.Slf4j;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup; import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.util.List; /**
* 类功能描述:generator big data Excel
*
* @author WangXueXing create at 19-4-13 下午10:23
* @version 1.0.0
*/
@Slf4j
public class ExcelGenerator { StringTemplateGroup stGroup = null;
PrintWriter writer = null; String templateSuffix = "Excel"; public ExcelGenerator() {
} public ExcelGenerator(String suffix, File file) {
this.templateSuffix = suffix;
this.stGroup = new StringTemplateGroup("test");
this.writer = writeExcelHead(file);
} /**
* 写入单个Sheet的Excel
*
* @param templatePrefix 模板前缀,默认两个模板后缀分别为head及body
* @param outFile 生成Excel文件
* @param sheetName 单个sheet名称
* @param dataList 填充数据列表
* @param <T> 填充对象泛型
* @throws FileNotFoundException
* @throws ClassNotFoundException
*/
public static <T> void writeExcelOneSheet(String templatePrefix, File outFile, String sheetName, Class clazz, List<T> dataList) {
long startTimne = System.currentTimeMillis();
StringTemplateGroup stGroup = new StringTemplateGroup(String.valueOf(startTimne));
// 写入excel文件头部信息
StringTemplate head = stGroup.getInstanceOf(templatePrefix + "head");
try (PrintWriter writer = new PrintWriter(new BufferedOutputStream(Files.newOutputStream(outFile.toPath())))) {
writer.print(head.toString());
writer.flush();
// excel单表最大行数是65535
Field[] fields = clazz.getDeclaredFields();
// 写入excel文件数据信息
StringTemplate body = stGroup.getInstanceOf(templatePrefix + "body");
Worksheet worksheet = new Worksheet();
worksheet.setSheet(sheetName);
worksheet.setColumnNum(fields.length + 2);
worksheet.setRowNum(10000 + 10);
worksheet.setRows(dataList);
body.setAttribute("worksheet", worksheet);
writer.print(body.toString());
writer.flush();
// 写入excel文件尾部
writer.print("</Workbook>");
writer.flush();
} catch (Exception e) {
log.error("写入Excel异常", e);
}
} public static String xmlTranslation(String s) {
// 写之前对特殊字符串进行转义
//&lt; <
// &gt; >
// &amp; &
// &apos; '
// &quot; "
s = s.replace("&", "&amp;");
s = s.replace("<", "&lt;");
s = s.replace(">", "&gt;");
s = s.replace("'", "&apos;");
s = s.replace("\"", "&quot;");
return s;
} /***
* 获取PrintWriter
*/
private PrintWriter writeExcelHead(File file) {
// 正式开始
try {
PrintWriter writer = new PrintWriter(new BufferedOutputStream(Files.newOutputStream(file.toPath())));
// 写入excel文件头部信息
StringTemplate head = stGroup.getInstanceOf(templateSuffix + "head");
writer.print(head.toString());
writer.flush();
// 头部信息写入完成
return writer;
} catch (Exception e) {
log.error("写入Excel异常", e);
}
return null;
} /***
* 写入excel文件数据信息
* 分页写入
*/
public <T> void writeExcelAssignSheetData(String sheetName, List<List<T>> dataList) {
// 写入excel文件数据信息
// 列数
for (int i = 0, dataListSize = dataList.size(); i < dataListSize; i++) {
List<T> x = dataList.get(i);
writeExcelOneSheetData(sheetName + "(" + (i + 1) + ")", x);
}
} /***
* 写入excel文件数据信息
* 一页写入
*/
public <T> void writeExcelOneSheetData(String sheetName, List<T> dataList) {
// 写入excel文件数据信息
// 列数
StringTemplate body = stGroup.getInstanceOf(templateSuffix + "body");
Worksheet worksheet = new Worksheet();
worksheet.setSheet(sheetName);
worksheet.setColumnNum(16384);
worksheet.setRowNum(dataList.size() + 10);
worksheet.setRows(dataList);
body.setAttribute("worksheet", worksheet);
this.writer.print(body.toString());
this.writer.flush();
worksheet = null;
body = null;
Runtime.getRuntime().gc();
} /***
* 写入excel文件尾部
*/
public void finishExcel() {
// 写入excel文件尾部
writer.print("</Workbook>");
writer.flush();
writer.close();
} }

关于通过StringTemplate模板生成xml转成excel后office无法打开的问题解决的更多相关文章

  1. NPOI根据模板生成chart图表导出Excel

    导入NPOI的全部dll. 因为NPOI的API里面还没有对于Chart图表方面的操作,所以只能根据提示做好的图表作为模板,修改数据源的方法来改变图表. 注意:NPOI要用2003版以下的excel才 ...

  2. Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"

    Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...

  3. JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载

    这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/13072711.html 引入jar包,freemarker.jar.apache-ant-zip- ...

  4. 使用freemarker生成xml模板

    今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...

  5. Spring MVC-集成(Integration)-生成XML示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_xml.htm 说明:示例基于Spring MVC 4.1.6. 以下示例说明如何 ...

  6. ASP.NET MVC 解析模板生成静态页一(RazorEngine)

    简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法 ...

  7. NET MVC RazorEngine 解析模板生成静态页

    ASP.NET MVC 解析模板生成静态页一(RazorEngine) 简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是 ...

  8. T4模板生成代码。 数据实体层与数据仓储层。备注

    文件生成模板:TempleteManager.ttinclude <#@ assembly name="System.Core" #><#@ assembly n ...

  9. freemarker根据模板生成word文件实现导出功能

    一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...

  10. java通过FreeMarker模板生成Excel文件之.ftl模板制作

    关于怎么通过freemarker模板生成excel的文章很多,关键点在于怎么制作模板文件.ftl 网上的办法是: (1)把Excel模板的格式调好,另存为xml文件 (2)新建一个.ftl文件,把xm ...

随机推荐

  1. 每日一题 力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/

    力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/ 这道题目用dp去做,构建邻接矩阵,做的时候需要注意题目条件,如果 ...

  2. 利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理

    有时候,我们在处理大量文档的时候,需要批量给Word文档添加印章处理,方便打印操作,本篇随笔介绍利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理. 1.利用Aspose. ...

  3. 如何编写难以维护的React代码?——滥用useEffect

    如何编写难以维护的React代码?--滥用useEffect 在许多项目中,我们经常会遇到一些难以维护的React代码.其中一种常见的情况是滥用useEffect钩子,特别是在处理衍生状态时.让我们来 ...

  4. ch-manager.sh

    [root@dev-clickhouse1 ~]# cat ch-manager.sh #!/bin/bash ch_arr=(ch1-shard1-main ch1-shard2-sub ch2-s ...

  5. asp.net core之HttpClient

    本文介绍了ASP.NET Core中的HttpClient和HttpClientFactory的作用.用法以及最佳实践.通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处 ...

  6. 【干货】浅谈如何给.net程序加多层壳达到1+1>2的效果

    软件破解分白盒和黑盒两种方式. 白盒破解:白盒破解是指对软件进行破解时,攻击者可以访问软件的内部结构和源代码.这种破解方式通常发生在软件的开发者.技术人员或软件公司内部.攻击者使用这些详细信息来理解软 ...

  7. 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar

    2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar ...

  8. 应用层协议之DNS、DHCP

    运输层为应用进程提供了端对端的通信服务,但不同的网络应用的应用进程之间,还需要有不同的通信规则.因此在运输层协议之上,还需要有应用层协议. 应用层中有这些常见的协议 域名系统:DNS 动态主机配置:D ...

  9. msfvenom参数简介

    -p, –payload < payload> 指定需要使用的payload(攻击荷载).也可以使用自定义payload,几乎是支持全平台的 -l, –list [module_type] ...

  10. Java日志系列:Log4j使用和原理分析

    目录 一.简介 二.使用 三.日志级别 四.组件说明 Loggers Appenders Layouts 五.配置 加载初始化配置 配置文件加载 查看日志记录器的详细信息 六.Layout的格式 七. ...