通过java的poi处理html的table生成导出excel
ConvertHtml2Excel:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import java.util.ArrayList;
import java.util.List;/*** @Auther: xiaoqiang* @Date: 2020/12/9 9:16* @Description:*/
public class ConvertHtml2Excel {/*** html表格转excel** @param tableHtml 如*            <table>*            ..*            </table>* @return*/public static HSSFWorkbook table2Excel(String tableHtml) {HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();List<CrossRangeCellMeta> crossRowEleMetaLs = new ArrayList<>();int rowIndex = 0;try {Document data = DocumentHelper.parseText(tableHtml);// 生成表头Element thead = data.getRootElement().element("thead");HSSFCellStyle titleStyle = getTitleStyle(wb);int ls=0;//列数if (thead != null) {List<Element> trLs = thead.elements("tr");for (Element trEle : trLs) {HSSFRow row = sheet.createRow(rowIndex);List<Element> thLs = trEle.elements("th");ls=thLs.size();makeRowCell(thLs, rowIndex, row, 0, titleStyle, crossRowEleMetaLs);rowIndex++;}}// 生成表体Element tbody = data.getRootElement().element("tbody");HSSFCellStyle contentStyle = getContentStyle(wb);if (tbody != null) {List<Element> trLs = tbody.elements("tr");for (Element trEle : trLs) {HSSFRow row = sheet.createRow(rowIndex);List<Element> thLs = trEle.elements("th");int cellIndex = makeRowCell(thLs, rowIndex, row, 0, titleStyle, crossRowEleMetaLs);List<Element> tdLs = trEle.elements("td");makeRowCell(tdLs, rowIndex, row, cellIndex, contentStyle, crossRowEleMetaLs);rowIndex++;}}// 合并表头for (CrossRangeCellMeta crcm : crossRowEleMetaLs) {sheet.addMergedRegion(new CellRangeAddress(crcm.getFirstRow(), crcm.getLastRow(), crcm.getFirstCol(), crcm.getLastCol()));setRegionStyle(sheet, new CellRangeAddress(crcm.getFirstRow(), crcm.getLastRow(), crcm.getFirstCol(), crcm.getLastCol()),titleStyle);}for(int i=0;i<sheet.getRow(0).getPhysicalNumberOfCells();i++){sheet.autoSizeColumn(i, true);//设置列宽if(sheet.getColumnWidth(i)<255*256){sheet.setColumnWidth(i, sheet.getColumnWidth(i) < 9000 ? 9000 : sheet.getColumnWidth(i));}else{sheet.setColumnWidth(i, 15000);}}} catch (DocumentException e) {e.printStackTrace();}return wb;}/*** 生产行内容** @return 最后一列的cell index*//*** @param tdLs th或者td集合* @param rowIndex 行号* @param row POI行对象* @param startCellIndex* @param cellStyle 样式* @param crossRowEleMetaLs 跨行元数据集合* @return*/private static int makeRowCell(List<Element> tdLs, int rowIndex, HSSFRow row, int startCellIndex, HSSFCellStyle cellStyle,List<CrossRangeCellMeta> crossRowEleMetaLs) {int i = startCellIndex;for (int eleIndex = 0; eleIndex < tdLs.size(); i++, eleIndex++) {int captureCellSize = getCaptureCellSize(rowIndex, i, crossRowEleMetaLs);while (captureCellSize > 0) {for (int j = 0; j < captureCellSize; j++) {// 当前行跨列处理(补单元格)row.createCell(i);i++;}captureCellSize = getCaptureCellSize(rowIndex, i, crossRowEleMetaLs);}Element thEle = tdLs.get(eleIndex);String val = thEle.getTextTrim();if (StringUtils.isBlank(val)) {Element e = thEle.element("a");if (e != null) {val = e.getTextTrim();}}HSSFCell c = row.createCell(i);if (NumberUtils.isNumber(val)) {c.setCellValue(Double.parseDouble(val));c.setCellType(CellType.NUMERIC);} else {c.setCellValue(val);}int rowSpan = NumberUtils.toInt(thEle.attributeValue("rowspan"), 1);int colSpan = NumberUtils.toInt(thEle.attributeValue("colspan"), 1);c.setCellStyle(cellStyle);if (rowSpan > 1 || colSpan > 1) { // 存在跨行或跨列crossRowEleMetaLs.add(new CrossRangeCellMeta(rowIndex, i, rowSpan, colSpan));}if (colSpan > 1) {// 当前行跨列处理(补单元格)for (int j = 1; j < colSpan; j++) {i++;row.createCell(i);}}}return i;}/*** 设置合并单元格的边框样式** @param sheet* @param region* @param cs*/public static void setRegionStyle(HSSFSheet sheet, CellRangeAddress region, HSSFCellStyle cs) {for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {HSSFRow row = sheet.getRow(i);for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {HSSFCell cell = row.getCell(j);cell.setCellStyle(cs);}}}/*** 获得因rowSpan占据的单元格** @param rowIndex 行号* @param colIndex 列号* @param crossRowEleMetaLs 跨行列元数据* @return 当前行在某列需要占据单元格*/private static int getCaptureCellSize(int rowIndex, int colIndex, List<CrossRangeCellMeta> crossRowEleMetaLs) {int captureCellSize = 0;for (CrossRangeCellMeta crossRangeCellMeta : crossRowEleMetaLs) {if (crossRangeCellMeta.getFirstRow() < rowIndex && crossRangeCellMeta.getLastRow() >= rowIndex) {if (crossRangeCellMeta.getFirstCol() <= colIndex && crossRangeCellMeta.getLastCol() >= colIndex) {captureCellSize = crossRangeCellMeta.getLastCol() - colIndex + 1;}}}return captureCellSize;}/*** 获得标题样式** @param workbook* @return*/private static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) {//short titlebackgroundcolor = IndexedColors.GREY_25_PERCENT.index;short fontSize = 12;String fontName = "宋体";HSSFCellStyle style = workbook.createCellStyle();style.setVerticalAlignment(VerticalAlignment.CENTER);style.setAlignment(HorizontalAlignment.CENTER);style.setBorderBottom(BorderStyle.THIN); //下边框style.setBorderLeft(BorderStyle.THIN);//左边框style.setBorderTop(BorderStyle.THIN);//上边框style.setBorderRight(BorderStyle.THIN);//右边框//style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//style.setFillForegroundColor(titlebackgroundcolor);// 背景色HSSFFont font = workbook.createFont();font.setFontName(fontName);font.setFontHeightInPoints(fontSize);font.setBold(true);style.setFont(font);return style;}/*** 获得内容样式** @param wb* @return*/private static HSSFCellStyle getContentStyle(HSSFWorkbook wb) {short fontSize = 12;String fontName = "宋体";HSSFCellStyle style = wb.createCellStyle();style.setBorderBottom(BorderStyle.THIN); //下边框style.setBorderLeft(BorderStyle.THIN);//左边框style.setBorderTop(BorderStyle.THIN);//上边框style.setBorderRight(BorderStyle.THIN);//右边框HSSFFont font = wb.createFont();font.setFontName(fontName);font.setFontHeightInPoints(fontSize);style.setFont(font);style.setAlignment(HorizontalAlignment.CENTER);//水平居中style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中style.setWrapText(true);return style;}
}

CrossRangeCellMeta:

/*** @Auther: xiaoqiang* @Date: 2020/12/9 9:17* @Description:*/
public class CrossRangeCellMeta {public CrossRangeCellMeta(int firstRowIndex, int firstColIndex, int rowSpan, int colSpan) {super();this.firstRowIndex = firstRowIndex;this.firstColIndex = firstColIndex;this.rowSpan = rowSpan;this.colSpan = colSpan;}private int firstRowIndex;private int firstColIndex;private int rowSpan;// 跨越行数private int colSpan;// 跨越列数public int getFirstRow() {return firstRowIndex;}public int getLastRow() {return firstRowIndex + rowSpan - 1;}public int getFirstCol() {return firstColIndex;}public int getLastCol() {return firstColIndex + colSpan - 1;}public int getColSpan(){return colSpan;}
}

代码大部分网上引用,修改先用版本的poi样式结合自己需求对代码微调

java html转excel相关推荐

  1. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  2. java ssh 下载excel,SSH整合WEB导出EXCEL案例

    基于Spring,Struts2,Hibernate整合, jsp页面导出(下载)excel文件的简单应用 1)本例不采用Java任何导出excel文件常用的poi或者jxl 等第三方jar包,仅仅基 ...

  3. java实现导出Excel的功能

    这篇文章主要为大家详细介绍了java实现导出Excel的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一 ...

  4. java poi 读取excel 编码_Java使用POI 读取和写入Excel指南

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求:网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0. ...

  5. JAVA实现创建Excel表并导出(转发)

    JAVA实现创建Excel表并导出(转发) 最近在做毕设,要求导出word,excel,pdf,这是excel. 原文是:http://blog.csdn.net/u014621859/article ...

  6. java邮件中添加excel_使用java api 创建excel内容并发送邮件

    https://github.com/auguszero/javaToolRepsitory 利用java api 创建excel 内容并发送邮件 主要实现功能: 1.通过配置文件设置发送邮件发送方, ...

  7. java导出 elsx 文件,如何获取java导出的excel文件,发送请求导出excle文件

    如何获取java导出的excel文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 request.setCharacterEncoding("utf-8"); ...

  8. java 简单获取Excel表格内容(初学者)

    java 简单获取Excel表格内容(初学者) 代码: package cn.ccaih.read;import org.apache.poi.ss.usermodel.Cell; import or ...

  9. Java中操作Excel的3种方法,太好用了!

    一.介绍 在平时的业务系统开发中,少不了需要用到导出.导入excel功能,今天我们就一起来总结一下,如果你正为此需求感到困惑,那么阅读完本文,你一定会有所收获! 二.poi 大概在很久很久以前,微软的 ...

  10. txt doc rtf html,JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例.docx

    JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例 JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例??2012-06-2 ...

最新文章

  1. c++中获取蓝图组件_蓝图C++混合编程
  2. eBPF在大厂的应用
  3. Android Studio开发基础之Service
  4. payara 创建 集群_在Payara Server和GlassFish中配置密码
  5. 微信公众账户模拟登陆后的一系列操作
  6. Beta版本测试报告
  7. 移动端开发—流式布局
  8. XSS、CSRF与验证码等等
  9. 如何升级mysql-libs_MySQL升级教程(CentOS)
  10. 最优化方法笔记-线性规划(大M法与两阶段法)
  11. EasyUI中combogrid设置onSelect后 获取不到getSelecte问题解决
  12. STM32----DMA控制器
  13. C++ deque类使用详解
  14. 外接硬盘在电脑中不显示的解决方案
  15. 1.7 正则表达式【匹配空白字符和非空白字符】
  16. 根据身高体重计算BMI指数 - scala
  17. 牛客网、赛码网javascript在线编程的输入输出
  18. 三.数 据 链 路 层
  19. Fiddle打开后,打开浏览器上不了网的问题解决
  20. 调用百度地图接口,在地图上添加标记并点击显示具体信息

热门文章

  1. GDB调试CoreDump文件
  2. Java 通过使用递归函数实现树状结构
  3. 清除svn文件(添加注册表方式)
  4. ubuntu20.04安装配置Qt5.15.2
  5. rd640服务器套件修复,联想 rd640_rd450_联想服务器rd640开机
  6. Android Settings搜索Search方案分析
  7. CA证书的签发与认证
  8. android复制短信到sim,Android开发之关于复制短信到SIM卡的分析.docx
  9. 云服务器如何选择合适的宽带大小?带宽计算、网络流量、页面大小
  10. 树莓派上手前的准备工作(一)——格式化sd卡(sd卡格式化工具的使用)