markdown本身不支持合并单元格, 但是兼容html, html支持该功能

0.1. html实现表格

0.1.1. 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<table><tr><td>姓名</td><td>年龄</td><td>性别</td></tr><tr><td>杨过</td><td>18</td><td>南</td></tr><tr><td>小龙女</td><td>18</td><td>女</td></tr>
</table>
姓名 年龄 性别
杨过 18
小龙女 18

0.1.2. 合并行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table><tr><td>姓名</td><td>年龄</td><td>性别</td></tr><tr><td rowspan="2">杨过</td><td>18</td><td>男</td></tr><tr><td>18</td><td>女</td></tr>
</table>
姓名 年龄 性别
杨过 18
18

0.1.3. 合并列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table><tr><td>姓名</td><td>年龄</td><td>性别</td></tr><tr><td colspan="2">杨过</td><td>男</td></tr><tr><td>小龙女</td><td>18</td><td>女</td></tr>
</table>
姓名 年龄 性别
杨过
小龙女 18

0.1.4. 混合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<table><tr><td>姓名</td><td>年龄</td><td>性别</td></tr><tr><td colspan="2" rowspan="2">杨过</td><td>男</td></tr><tr><td>女</td></tr>
</table>
姓名 年龄 性别
杨过

0.2. java读取excel自动生成

0.2.1. 自己写的小工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
package com.learning.demo.util.html;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;/*** Excel解析处理*/
public class HtmlExcelUtil {private Logger log = LoggerFactory.getLogger(this.getClass());private static final String UNION = "table_union_used";private Workbook workbook;public HtmlExcelUtil(File file) throws Exception {workbook = WorkbookFactory.create(new FileInputStream(file));}public void buildHtmlExcel() {TableColumnGroup tableColumnMap = getTableColumnMap();soutHtmlTable(tableColumnMap);}private void soutHtmlTable(TableColumnGroup tableColumnMap) {Map<String, TableColumn> map = tableColumnMap.getMap();Integer maxCell = tableColumnMap.getMaxCell();Integer maxRow = tableColumnMap.getMaxRow();StringBuilder sb = new StringBuilder();sb.append("<table>");for (int y = 0; y <= maxRow; y++) {sb.append("<tr>");for (int x = 0; x <= maxCell; x++) {TableColumn tableColumn = map.get(x + "-" + y);if (tableColumn == null) {continue;}String value = tableColumn.getValue();if (!UNION.equals(value)) {sb.append("<td ");if (tableColumn.getHigh() > 1) {sb.append("rowspan=\"");sb.append(tableColumn.getHigh());sb.append("\" ");}if (tableColumn.getWide() > 1) {sb.append("colspan=\"");sb.append(tableColumn.getWide());sb.append("\" ");}sb.append(">");sb.append(value);sb.append("</td>");}}sb.append("</tr>");}sb.append("</table>");System.out.println(sb.toString());}/*** 读取处理excel数据** @throws Exception*/public TableColumnGroup getTableColumnMap() {try {Sheet sheet = workbook.getSheetAt(0);Map<String, TableColumn> map = new HashMap<>();// 处理合并单元格buildUnionTable(sheet, map);int lastRowNum = sheet.getLastRowNum();short lastCellNum = sheet.getRow(0).getLastCellNum();for (int rowIndex = 0; rowIndex <= lastRowNum; rowIndex++) {Row row = sheet.getRow(rowIndex);for (short cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {Cell cell = row.getCell(cellIndex);String cellValue = (String) getCellValue(cell);String key = cellIndex + "-" + rowIndex;if (map.get(key) == null) {map.put(key, new TableColumn(cellValue));}}}return new TableColumnGroup(map, (int) lastCellNum, lastRowNum);} catch (Exception e) {log.error("解析Excel异常", e);} finally {try {workbook.close();} catch (Exception e) {log.error("workbook关闭异常", e);}}return null;}/*** 处理合并单元格** @param sheet* @param map*/private void buildUnionTable(Sheet sheet, Map<String, TableColumn> map) {// 遍历合并区域for (int i = 0; i < sheet.getNumMergedRegions(); i++) {CellRangeAddress region = sheet.getMergedRegion(i);//int firstColumn = region.getFirstColumn();             // 合并区域首列位置int lastColumn = region.getLastColumn();int firstRow = region.getFirstRow();                     // 合并区域首行位置int lastRow = region.getLastRow();Row firRow = sheet.getRow(firstRow);Cell firCell = firRow.getCell(firstColumn);String cellValue = (String) getCellValue(firCell);TableColumn tableColumn = new TableColumn(lastColumn - firstColumn + 1, lastRow - firstRow + 1, cellValue);map.put(firstColumn + "-" + firstRow, tableColumn);// 处理合并单元格boolean flag = true;for (int y = firstRow; y <= lastRow; y++) {for (int x = firstColumn; x <= lastColumn; x++) {if (flag) {flag = false;continue;}TableColumn value = new TableColumn(UNION);map.put(x + "-" + y, value);}}}}/*** 获取cell内容** @param cell* @return*/private String getCellValue(Cell cell) {String value = null;if (cell != null) {switch (cell.getCellTypeEnum()) {case STRING:if (cell.getStringCellValue().trim().equals("'")) {value = "";} else if (cell.getStringCellValue().trim().equals("")) {value = null;} else {value = cell.getStringCellValue();}break;case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {value = cell.getDateCellValue().toString();} else {value = new DecimalFormat("#.######").format(cell.getNumericCellValue());}break;case BLANK:value = null;break;default:value = null;}}if (StringUtils.isNotEmpty(value)) {// 替换多余2个的空格为单个空格,替换空行为单个空格value = value.replaceAll("\\s{2,}", " ").replaceAll("(?m)^\\s*$" + System.lineSeparator(), " ");}return value;}class TableColumnGroup {private Map<String, TableColumn> map;private Integer maxCell;private Integer maxRow;TableColumnGroup(Map<String, TableColumn> map, Integer maxCell, Integer maxRow) {this.map = map;this.maxCell = maxCell;this.maxRow = maxRow;}Map<String, TableColumn> getMap() {return map;}Integer getMaxCell() {return maxCell;}Integer getMaxRow() {return maxRow;}}class TableColumn {private Integer wide;private Integer high;private String value;TableColumn(String value) {this.high = 1;this.wide = 1;this.value = value;}TableColumn(Integer wide, Integer high, String value) {this.wide = wide;this.high = high;this.value = value;}Integer getHigh() {return high;}Integer getWide() {return wide;}String getValue() {return value;}}}

0.2.2. 调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.learning.demo.util.html;import java.io.File;/*** Classname:HtmlTableTest* Description:TODO* date:2019-12-17 16:58* author:yuyu*/
public class HtmlTableTest {public static void main(String[] args) throws Exception {HtmlExcelUtil htmlExcelUtil = new HtmlExcelUtil(new File("/Users/yuyu/Documents/secooDoc/update-仅修改.xlsx"));htmlExcelUtil.buildHtmlExcel();}}

markdown合并单元格相关推荐

  1. 实用常识 | HTML嵌入处理MARKDOWN合并单元格

    解决 MARKDOWN 合并单元格问题-- 嵌入HTML代码,增加 rowspan 或 colspan 属性来实现合并单元格. 操作对象 操作方式 创建 删除 修改 模式 CREATE SCHEMA ...

  2. markdown 合并单元格

    markdown 合并单元格 markdown 本身没有合并单元格的语法.但是在实际使用中却有合并单元格的需求. markdown 虽然没有合并单元格的语法,但是 markdown 是兼容 HTML ...

  3. markdown 合并单元格、表格内换行

    <table><tr><td colspan="2">列表</td></tr><tr><td>1 ...

  4. Markdown编辑表格实现合并单元格、单元格内容换行

    Markdown虽然没有合并单元格的语法,但是Markdown是兼容HTML的,因此,我们可以通过HTML的方式实现单元格合并. 跨行合并使用 rowspan 属性 跨列合并使用 colspan 属性 ...

  5. markdown表格在github/gitee中合并单元格

    markdown表格合并单元格只能是在.md文件中使用html   代码 github/gitee中的显示效果 横向合并 <table>   <tr>     <td&g ...

  6. Markdown(六)——表格合并单元格增加标题

    前言:之前有写过Markdown的表格记录处理标记,见Markdown语法(三)--列表&表格.但是发现这种方式不能合并单元格,对想要合并单元格的数据很不友好.好在Markdown可以支持HT ...

  7. Markdown表格中换行、合并单元格

    1.表格中内容对齐.换行 常规表格使用 一般我们都会这样用表格如下: 姓名 年龄 爱好 小明 9 篮球 小刚 10 篮球.足球 效果如下: 姓名 年龄 爱好 小明 9 篮球 小刚 10 篮球.足球 设 ...

  8. 【markdown】表格合并单元格

    [markdown]表格合并单元格 DEMO DEMO 效果 参考链接 :[markdown]表格合并单元格 DEMO <table><tr><th>属性</ ...

  9. Markdown 中的表格合并单元格

    Markdown 中没有合并单元格的语法,但 Markdown 是兼容 HTML 的,可通过 HTML 的方式实现单元格合并. 示例代码及效果如下: <table><tr>&l ...

  10. Markdown表格—合并单元格—设置单元格颜色

    Markdown表格设计 ~~~~~~~我之前做表格遇到一些问题,特别是两个小表格想要放在同一行,却不行,所以想着要合并单元格.但是多个表格合并和想要分割线却没有,只好用颜色代替了.但是Markdow ...

最新文章

  1. java 多级级联菜单回显_详解element-ui级联菜单(城市三级联动菜单)和回显问题...
  2. Asp.Net MVC4下设置W3P3(IIS)调试步骤
  3. QT的QSGGeometryNode类的使用
  4. Entity Framework Core 5中实现批量更新、删除
  5. 309. Best Time to Buy and Sell Stock with Cooldown
  6. 消息中间件系列(九):详解RocketMQ的架构设计、关键特性、与应用场景
  7. Android 仿iOS弹窗
  8. 网易严选宣布退出“双11”;iPhone或将重新使用Touch ID;TypeScript 4.1 RC 发布|极客头条
  9. windows server2012在已有.net4.5框架的基础上安装.net3.5的方法
  10. 李开复、张亚勤、吴恩达…国际大咖给你讲解AI知识
  11. 如何分析及处理 Flink 反压?
  12. 0.0 研磨设计模式
  13. directshow方法关键帧java,如何实现DirectShow source filter
  14. 计算机操作系统-1-总览
  15. 苹果手机怎么查看已连接wifi密码_手机连不上wifi显示已保存怎么回事【原因介绍】...
  16. 批量导出Outlook所有联系人到vcard文件
  17. 解决oracle异常ORA-01012: not logged on
  18. 活码生成器是什么?怎么用活码生成器制作活码?有没有免费的活码生成器?
  19. 计算机组成原理基础知识试题及答案,[电脑基础知识]计算机组成原理试题库.doc...
  20. MDCC王戈点爆全场:Smule乐器王是怎样炼成的

热门文章

  1. 清华计算机毕业论文,清华大学本科毕业论文
  2. 城市聚焦:全球十二大性感之城
  3. 天地劫一直说服务器在维护,天地劫手游网络连接错误怎么办 天地劫幽城再临网络异常解决方法...
  4. python爬取网页数据总结_pycharm爬取网页数据
  5. kotlin android 开源,Kotlin开源项目集合
  6. 服务器搭建ftp共享文件夹,设置共享文件夹或者搭建FTP服务器。
  7. 微信公众平台与微信公众平台的区别与联系
  8. 一文讲懂蓝绿发布和金丝雀发布
  9. python三维图形等高线_python等高线
  10. 而立之年——三线城市程序员的年终告白