关于通过StringTemplate模板生成xml转成excel后office无法打开的问题解决
说明:本人最近在着手实现导出日志数据,由于日志数据过多,在网上查找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) {
// 写之前对特殊字符串进行转义
//< <
// > >
// & &
// ' '
// " "
s = s.replace("&", "&");
s = s.replace("<", "<");
s = s.replace(">", ">");
s = s.replace("'", "'");
s = s.replace("\"", """);
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) {
// 写之前对特殊字符串进行转义
//< <
// > >
// & &
// ' '
// " "
s = s.replace("&", "&");
s = s.replace("<", "<");
s = s.replace(">", ">");
s = s.replace("'", "'");
s = s.replace("\"", """);
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无法打开的问题解决的更多相关文章
- NPOI根据模板生成chart图表导出Excel
导入NPOI的全部dll. 因为NPOI的API里面还没有对于Chart图表方面的操作,所以只能根据提示做好的图表作为模板,修改数据源的方法来改变图表. 注意:NPOI要用2003版以下的excel才 ...
- 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的格式写入 ...
- JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载
这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/13072711.html 引入jar包,freemarker.jar.apache-ant-zip- ...
- 使用freemarker生成xml模板
今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...
- Spring MVC-集成(Integration)-生成XML示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_xml.htm 说明:示例基于Spring MVC 4.1.6. 以下示例说明如何 ...
- ASP.NET MVC 解析模板生成静态页一(RazorEngine)
简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法 ...
- NET MVC RazorEngine 解析模板生成静态页
ASP.NET MVC 解析模板生成静态页一(RazorEngine) 简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是 ...
- T4模板生成代码。 数据实体层与数据仓储层。备注
文件生成模板:TempleteManager.ttinclude <#@ assembly name="System.Core" #><#@ assembly n ...
- freemarker根据模板生成word文件实现导出功能
一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...
- java通过FreeMarker模板生成Excel文件之.ftl模板制作
关于怎么通过freemarker模板生成excel的文章很多,关键点在于怎么制作模板文件.ftl 网上的办法是: (1)把Excel模板的格式调好,另存为xml文件 (2)新建一个.ftl文件,把xm ...
随机推荐
- 解决 Windows 环境下 conda 切换 Python 版本报错 NoWritablePkgsDirError: No writeable pkgs directories configured.
1. 起因 今天运行一个 flask 项目,报错:AttributeError: module 'time' has no attribute 'clock' 一查才发现,Python3.8 不再支持 ...
- Flex布局常用属性详解
1. Flex布局与响应式布局 1.1 为什么需要响应式布局? 在电脑PC端,使用浮动,定位同时使用像素px单位就可以完成大部分布局,而且布局完之后不会有大问题,但是到了移动端,移动设备的屏幕尺寸多种 ...
- 基于python+django的宠物商店-宠物管理系统设计与实现
该系统是基于python+django开发的宠物商店-宠物管理系统.是给师妹开发的课程作业.现将源码开放给大家.大家学习过程中,如遇问题可以在github咨询作者. 演示地址 前台地址: http:/ ...
- ISP图像处理—紫边Purple Fringing
图像紫边存在数码相机.监控摄像头等数字成像图像,使用设备在逆光.大光圈条件下拍摄图像的高反差区域容易出现紫边,解决图像自编问题有助设备得到完美图像. 紫边成因分析和确定有助与紫边消除的图像处理算法研究 ...
- C语言基础-基础指针
文章目录 指针 前言 1.什么是指针 2.指针的使用 (1)指针的定义 (2)指针的赋值 (3)指针类型 (4)如何使用指针 3.野指针 (1)导致野指针的原因 ① 未初始化指针 ②指针越界访问 ③指 ...
- 将Dubbo注册到Nacos,与DubboAdmin的部署
王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 本文是<从 0 开始学 Dubbo>系列文章中应用篇的番外篇. 在这篇文章中我会和大家一起部署 ...
- vulnhub billu:b0x
知识点 SQLi.目录爆破.数据库操作.文件包含漏洞.提权.反弹shell 解题步骤 nmap扫描有80,22端口 nmap -sV -Pn -T 4 192.168.220.132 访问网页提示sq ...
- 【go语言】1.1.2 Go 语言的特性
1. 简洁的语法 Go 语言的语法设计上非常简洁明了,没有复杂的继承和泛型,也没有异常处理,但这并不影响它的功能性和表达力.这使得 Go 语言容易学习和使用. 例如,以下是一个简单的 Go 函数,用于 ...
- 使用gulp.js打包layuiAdmin
安装nvm 在nvm目录下,找到settings.txt,追加以下两行加速nvm(淘宝镜像)node_mirror: https://npm.taobao.org/mirrors/node/npm_m ...
- rpm安装21c单实例数据库
linux 7.6 使用rpm安装21c单实例数据库 一.基础环境配置 1.1 关闭防火墙 systemctl stop firewalld systemctl disable firewalld s ...