关于通过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 ...
随机推荐
- IoTOS-v1.2.1接入J-IM(t-io)后台通知App
IoTOS v1.2.1 一.登录页增加可修改轮播 登录页增加可修改数据轮播: 首页轮播图由背景图片.标题.介绍.按钮一.按钮二(可配置跳转地址打开方式)组合而成 二.登录页增加常用运营商平台& ...
- 微信小程序生态15- 批量提交微信小程序审核的一种方式
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是『微信小程序生态系列文章』正文! 需求背景 ...
- 2023ccpc大学生程序设计竞赛-zx
这次ccpc整体来说做题做的比较卡,第一个签到都wa了,后面几道中档题全都是至少wa一次才能过,这导致我们不仅罚时增加也导致需要大量时间修改代码,还有一个G题很可惜,当时只注意到B过题多所以有点被带歪 ...
- 统一观测丨使用 Prometheus 监控 Cassandra 数据库最佳实践
作者:元格 本篇内容主要包括四部分:Cassandra 概览介绍.常见关键指标解读.常见告警规则解读.如何通过 Prometheus 建立相应监控体系. Cassandra 简介 Cassandra ...
- js 文字像打字一样缓缓出现
点击查看代码 <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UT ...
- mysql 命令安装
1. mysql 下载安装好压缩文件,下面我们进入正题,少废话. 09:39:112023-08-05 先到 mysql 官方网站下载:https://dev.mysql.com/downloa ...
- [gin]数据解析和绑定
前言 go version: 1.18 本文主要包含JSON.Form.Uri.XML的数据解析与绑定. JSON数据解析与绑定 go代码 package main import ( "ne ...
- 利用IPV6随时访问家中影音Jellyfin
本文章主要记录通过ipv6实现家庭影音中心在互联网上的访问. 之前很多方案都是通过第三方进行内网穿透,实际体验不是很好.目前ipv6发展迅速,完全可以取代这种以ipv4为中心的内网资源外网访问的方式. ...
- 网络请求-Android篇(Okhttp和Retrofit)
一.OkHttp的介绍和基本用法 OkHttp是一个流行的开源Java和Android应用程序的HTTP客户端.它由Square Inc.开发,提供了一种简单高效的方式来进行应用程序中的HTTP请求. ...
- Kafka-基础
1. 简介 Kafka(Apache Kafka) 是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目.它被设计用于处理大规模.实 ...