起因

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

生成方式

pom依赖

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>4.0.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-excelant</artifactId>
  9. <version>4.0.0</version>
  10. </dependency>

生成excel换行代码

  1. @Test
  2. public void test() throws IOException {
  3.  
  4. Workbook wb = new SXSSFWorkbook(); //or new HSSFWorkbook();
  5. Sheet sheet = wb.createSheet();
  6.  
  7. Row row = sheet.createRow(2);
  8. Cell cell = row.createCell(3);
  9. XSSFRichTextString rich = new XSSFRichTextString("测试\r" + "换行");
  10. cell.setCellValue(rich);
  11.  
  12. CellStyle cellStyle = wb.createCellStyle();
  13. cellStyle.setWrapText(true);
  14.  
  15. cell.setCellStyle(cellStyle);
  16.  
  17. try (OutputStream fileOut = new FileOutputStream("ooxml-newlines.xlsx")) {
  18. wb.write(fileOut);
  19. }
  20. }

代码解析

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

  1. String codepoint = (String)var2.next();
  2. byte var5 = -1;
  3. switch(codepoint.hashCode()) {
  4. case 9:
  5. if (codepoint.equals("\t")) {
  6. var5 = 6;
  7. }
  8. break;
  9. case 10:
  10. if (codepoint.equals("\n")) {
  11. var5 = 4;
  12. }
  13. break;
  14. case 13:
  15. if (codepoint.equals("\r")) {
  16. var5 = 5;
  17. }
  18. break;
  19. case 34:
  20. if (codepoint.equals("\"")) {
  21. var5 = 3;
  22. }
  23. break;
  24. case 38:
  25. if (codepoint.equals("&")) {
  26. var5 = 2;
  27. }
  28. break;
  29. case 60:
  30. if (codepoint.equals("<")) {
  31. var5 = 0;
  32. }
  33. break;
  34. case 62:
  35. if (codepoint.equals(">")) {
  36. var5 = 1;
  37. }
  38. break;
  39. case 160:
  40. if (codepoint.equals(" ")) {
  41. var5 = 7;
  42. }
  43. }
  44.  
  45. switch(var5) {
  46. case 0:
  47. this._out.write("&lt;");
  48. break;
  49. case 1:
  50. this._out.write("&gt;");
  51. break;
  52. case 2:
  53. this._out.write("&amp;");
  54. break;
  55. case 3:
  56. this._out.write("&quot;");
  57. break;
  58. case 4:
  59. this._out.write("
  60. ");
  61. break;
  62. case 5:
  63. this._out.write("
  64. ");
  65. break;
  66. case 6:
  67. this._out.write(" ");
  68. break;
  69. case 7:
  70. this._out.write(" ");
  71. break;
  72. default:
  73. if (codepoint.length() == 1) {
  74. char c = codepoint.charAt(0);
  75. if (replaceWithQuestionMark(c)) {
  76. this._out.write(63);
  77. } else {
  78. this._out.write(c);
  79. }
  80. } else {
  81. this._out.write(codepoint);
  82. }
  83. }

由上可见,\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. CF908G 题解

    题意 传送门 给 \(x\le10^{700}\),问 \(1\) 到 \(x\) 中每个数在各数位排序后得到的数的和.答案模 \(10^9+7\). 题解 学到一种新鲜的转化方式,来记一下. 将 \ ...

  2. 用简单的代码,将小程序文件直传到腾讯云COS实践

    简介 本文介绍如何不依赖 SDK,用简单的代码,在小程序直传文件到腾讯云COS的存储桶. 注意: 本文档内容基于 XML 版本的 API. 前期条件 登录 对象存储控制台 ,创建存储桶,设置 Buck ...

  3. css制作仿商城侧边导航

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. linux发展史及软件配置

    linux岗位需求 # 1.岗位需求 自动化运维,容器运维,DBA,IDC运维(不建议) ps:linux岗位会的越多给的越多 linux工作本质 linux简要发展史 # 1.发展 1991年,芬兰 ...

  5. Java使用HSSFWorkbook生成Excel

    HSSF 是Horrible SpreadSheet Format的缩写,也即"讨厌的电子表格格式". 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃.正规的API.通过H ...

  6. Windows本地文件上传到Linux服务器(腾讯云)

    环境 本地 操作系统:Window 10 企业版LTSC;内存:8GB;操作类型:64位. 服务器 CentOS 8(1核2GB,1Mbps) 64位 ,已安装Docker(CentOS 8 的doc ...

  7. flutter-android

    多端开发框架 含义:通过一套代码编译成在 H5/微信小程序/React Native/百度小程序/支付宝小程序等端运行的代码. 技术简介:Taro,uniapp Taro是一个开放式跨端跨框架解决方案 ...

  8. OpenEuler 中C与汇编的混合编程

    2.5.1用汇编代码编程 将C代码编译成汇编代码 C代码: /**********a.c file********/ #include <stdio.h> extern int B(); ...

  9. Vue添加--图片 二级联动

    二级联动: 首先在数据处理层写对应语句, #region 分类 public List<GTYpe> GTYpe(int id) { return db.GTYpe.Where(p =&g ...

  10. <<Python编程:从入门到实践>>踩坑记 Django

    <<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是 ...