起因

导出的excel需要在表格内换行,但搜索到的方法都实现不了我的需求,经同事搜查得知,这是POI的一个bug,已经在17年八月后被解决。

生成方式

pom依赖

        <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>4.0.0</version>
</dependency>

生成excel换行代码

@Test
public void test() throws IOException { Workbook wb = new SXSSFWorkbook(); //or new HSSFWorkbook();
Sheet sheet = wb.createSheet(); Row row = sheet.createRow(2);
Cell cell = row.createCell(3);
XSSFRichTextString rich = new XSSFRichTextString("测试\r" + "换行");
cell.setCellValue(rich); CellStyle cellStyle = wb.createCellStyle();
cellStyle.setWrapText(true); cell.setCellStyle(cellStyle); try (OutputStream fileOut = new FileOutputStream("ooxml-newlines.xlsx")) {
wb.write(fileOut);
}
}

代码解析

SXSSFWorkbook是先将数据生成xml存储在本地,转化的时候会对表格内数据进行转义,具体代码见
org.apache.poi.xssf.streaming.SheetDataWriter#outputQuotedString()方法,内部代码为:

 String codepoint = (String)var2.next();
byte var5 = -1;
switch(codepoint.hashCode()) {
case 9:
if (codepoint.equals("\t")) {
var5 = 6;
}
break;
case 10:
if (codepoint.equals("\n")) {
var5 = 4;
}
break;
case 13:
if (codepoint.equals("\r")) {
var5 = 5;
}
break;
case 34:
if (codepoint.equals("\"")) {
var5 = 3;
}
break;
case 38:
if (codepoint.equals("&")) {
var5 = 2;
}
break;
case 60:
if (codepoint.equals("<")) {
var5 = 0;
}
break;
case 62:
if (codepoint.equals(">")) {
var5 = 1;
}
break;
case 160:
if (codepoint.equals(" ")) {
var5 = 7;
}
} switch(var5) {
case 0:
this._out.write("&lt;");
break;
case 1:
this._out.write("&gt;");
break;
case 2:
this._out.write("&amp;");
break;
case 3:
this._out.write("&quot;");
break;
case 4:
this._out.write(" ");
break;
case 5:
this._out.write(" ");
break;
case 6:
this._out.write(" ");
break;
case 7:
this._out.write(" ");
break;
default:
if (codepoint.length() == 1) {
char c = codepoint.charAt(0);
if (replaceWithQuestionMark(c)) {
this._out.write(63);
} else {
this._out.write(c);
}
} else {
this._out.write(codepoint);
}
}

由上可见,\r会被解析成 ,这个字符会被excel解析成换行,以此来达到换行的目的。而我之前使用的是3.9的版本,那个版本里会将\r和 \n都解析成 ,这个字符会被excel解析成空格,而不是换行。

转载:https://blog.csdn.net/Evelyn_Jone/article/details/85253776

SXSSFWorkbook 表格内换行的更多相关文章

  1. markdown如何在表格内换行?

    答:使用<br>即可在表格内换行

  2. Latex 表格内公式换行方法

    Latex 表格内的公式实现换行的方法       简单的两步走:   1.先将下面的语句放在latex正文的导言区: \newcommand{\tabincell}[2]{\begin{tabula ...

  3. Excel自文本导入内容时如何做到单元格内换行

    前言:今天在处理数据的时候,在数据库中用到了\n换行符号,目的是在同表格内做到数据多行显示,比如  字段名1  字段名2  字段名3  1 数据一行 数据二行 数据三行 例子是在sql查询后的结果  ...

  4. excel单元格内换行的方法

    方法一:调整单元格格式换行 选定单元格,选择“格式→单元格”,在弹出的对话框中单击“对齐”,选中“自动换行”,单击[确定]按钮即可. 方法二:Alt+Enter键(使用强行换行时,系统会同时选择自动换 ...

  5. table表格在设置文字垂直居中后,在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行

    table设置了垂直居中后在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行, 此时会导致table会把页面撑的很宽,导致表格后 ...

  6. 怎么把excel表格内的数据导入数据库?

    第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...

  7. Excel 2007表格内输入http取消自动加上超链接的功能

    经常使用Excel表格工作的也许会发现,当我们在表格内输入http://XXXX时,默认情况下都会自动加上超链接,如下: 当我们点击域名准备编辑修改时,往往都会调用浏览器转到该域名之下,达不到编辑修改 ...

  8. Linqpad使用(调试Linq、结合linq调试业务场景、表格内编辑数据)

      linqpad是一款linq语句调试工具,功能如下: 1.直接执行linq语句并查看生成的原生sql语句 2.可结合linq+C#代码进行业务场景调试 3.表格内直接新增.修改.删除数据 4.直接 ...

  9. C#使用Command将dataGrideView表格内数据与数据库交互

    本文主要介绍通过Command类使用SQL插入指令insert与查询指令select将dataGrideView表格内添加至数据库,与从数据库读出数据存放在dataGrideView表格中. C#制作 ...

  10. <HTML>在一个表格内嵌套另一个表格时,如何居中?

    在一个表格内嵌套另一个表格时,如何居中? 假设大表格为: <table id="tableRow"> <tr> <th>City</th& ...

随机推荐

  1. .NET在单台Windows2008下百万TCP连接测试

    测试客户端: 客户端程序建立TCP连接,发送一条几个字节的数据. 虚拟机8台,PC机8台,服务器1台. 设置MaxUserPort=60000,有一台机没有设置约在1.5万左右.最后因为差一点到100 ...

  2. 2022-04-14内部群每日三题-清辉PMP

    1.项目经理资源有限,无法获得更多资源.项目经理应该使用什么技术来充分利用现有资源,而不会令项目完成时间延期? A.资源平滑 B.资源平衡 C.快速跟进 D.赶工 2.正在审查问题日志的项目经理注意到 ...

  3. Java 一次操作多条数据

    //新增 <insert id="insertSelectiveList" useGeneratedKeys="true" parameterType=& ...

  4. 【SSO单点系列】(1):CAS4.0 之环境的搭建

    [SSO单点系列](1):CAS4.0 环境的搭建 一.概述 今天开始写CAS相关的第一篇文章,这篇文章主要是关于CAS环境的搭配,提供给刚刚接触CAS的一个入门指南,并演示一个CAS的最简单的实例 ...

  5. C# TreeView查获节点并选中节点

    在一个项目中用到了TreeView,但是每次刷新TreeView的数据之后,所有的节点都会折叠起来 非常影响用户体验,使用下面的方法可以解决这个问题 string LastSelectNode = & ...

  6. 【shell脚本实战】脚本#35 分析每个用户使用的磁盘空间大小

    #!/bin/bash #设置 一个变量代表临界值,看看是否能超过这个值,单位是MB MAXDISKUSAGE=20000 #cut -d: -f1,3 /etc/passwd | awk -F: ' ...

  7. http和https有什么区别?网站有没有必要启用https

    最近在浏览文章的时候发现,很多站长都在纠结网站到底要不要做https的问题.作为个人站长,也一直关注着这块.最近查阅了很多资料,对https也有了更进一步的认识,这里对https的有关问题做了一个总结 ...

  8. 关于unity游戏的类名查找

    这里我用火影演示 首先我们知道,鸣人的决斗场技能代码为900010151,0251,0351,0451等等 我们进行搜索 然后再转到第二个进去(第一个为忍者技能的序列表) 注:序列表里的代码与那个他相 ...

  9. vscode php 方法无法跳转问题

    安装扩展 PHP IntelliSense #路径感知 PHP Intelephense  #自动补全 PHP DocBlocker #在类或属性.方法上面敲/**回车自动生成参数注释等 PHP Na ...

  10. cpu主频对网络传输性能的影响

    数据包长度是:2KB iperf的测试结果:3.2GHz的cpu能上40Gb/s, 2.1GHz的cpu只能到28Gb/s.