大致代码在网上百度的,稍微有些改动。完善单元格文字居中,列的宽度随单元格内容改变,合并单元格边框显示不全的问题。

package com.wisdombud.szxtyms.business.util;import java.util.ArrayList;
import java.util.List;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFCellUtil;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import com.wisdombud.szxtyms.util.CrossRangeCellMeta;/***** html转excel* @author user**/
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<CrossRangeCellMeta>();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()),contentStyle);}for(int i=0;i<ls;i++){sheet.autoSizeColumn(i, true);//设置列宽}} 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(HSSFCell.CELL_TYPE_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 = HSSFCellUtil.getRow(i, sheet);for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {HSSFCell cell = HSSFCellUtil.getCell(row, (short) 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 = HSSFColor.GREY_25_PERCENT.index;short fontSize = 12;String fontName = "宋体";HSSFCellStyle style = workbook.createCellStyle();style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setFillForegroundColor(titlebackgroundcolor);// 背景色HSSFFont font = workbook.createFont();font.setFontName(fontName);font.setFontHeightInPoints(fontSize);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);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((short) 1);style.setBorderTop((short) 1);style.setBorderLeft((short) 1);style.setBorderRight((short) 1);HSSFFont font = wb.createFont();font.setFontName(fontName);font.setFontHeightInPoints(fontSize);style.setFont(font);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中return style;}
}

封装跨行元素的信息

package com.wisdombud.szxtyms.util;/*** table转excel* 跨行元素元数据* */
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;}
}

转载于:https://www.cnblogs.com/hxhome/p/7366311.html

关于Java html table表格转excel相关推荐

  1. js table表格导出Excel 设置文件名称

    一.table表格导出 <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...

  2. 利用poi实现table表格导出excel

    思路:把table转成json数据传到后台(需要用到jquery.tabletojson.min.js),json转成list<list<String>>类型.利用poi导出e ...

  3. elementui中有导出组件吗_Element-ui组件库Table表格导出Excel表格

    安装 npm install --save xlsx file-saver 两个插件的详细地址在下面 https://github.com/SheetJS/js-xlsx https://github ...

  4. vue中Table表格转为Excel文件的方法

    首先要下载file-saver插件.xlsx插件和xlsx-style插件 npm install file-saver npm install xlsx npm install xlsx-style ...

  5. 前端页面HTML表格生成EXCEL下载

    前言 主要使用jquery插件工具table2excel来实现将HTML页面上的table表格生成Excel下载到客户端.(兼容IE和chrome浏览器) 由于功能比较简单,会使用jquery的相关工 ...

  6. html表格类似excel固定表头样式,(转)supertable像excel那样固定table的表头和第一列...

    像excel那样固定table的表头和第一列 .left,.right{float: left;height: 297px;background-color: #ccc;} #left_topic{h ...

  7. java 操作 word 表格和样式,java读取word表格中的表格 java如何读取word中的excel表格数据...

    Java 利用poi 可以直接读取word中的表格保持样式生1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi ...

  8. asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL

    代码: 1 /// <summary> 2 /// HTML Table表格数据(html)导出EXCEL 3 /// </summary> 4 /// <param n ...

  9. java使用poi读取存储excel表格,包括xls和xlsx格式

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用poi读取存储excel表格,包括xls和xlsx格式. 需要导入的包 poi-3.14.jar poi-ooxml-3.14.jar ...

  10. java使用jxl包读写excel表格文件,即xls格式文件

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用jxl包读写excel表格文件,即xls格式文件 本实例演示使用jxl包实现对excel文件的操作,下载 测试代码 public st ...

最新文章

  1. Android Application中的Context和Activity中的Context的异同
  2. 26.进程空间和线程空间
  3. 【设计模式】各设计模式设计的可变部分的支持
  4. Azure云端部署Exchange 2016双数据中心—Part6(DAG切换测试)
  5. python-time.time()
  6. android viewgroup点击变色,Android ViewGroup事件分发
  7. 【Vue.js源码解析 二】-- 虚拟 DOM
  8. PHP+MySql+PDO实现简单增加、删除、修改、查询
  9. 2017.9.17 相关分析 思考记录
  10. jmeter中控制器其中一个访问不到_Jmeter你所不知道的知识点!
  11. C#笔记03 运算符和分支结构
  12. 微信加人限制2017版
  13. 【qcom msm8953 android712】rtc 调试分析续
  14. 免费下载 | 秒变钉钉应用开发达人!《钉钉应用开发者速成手册》独家上线
  15. android lame wav 转 mp3,Wav文件转mp3(LAME)
  16. 论文阅读:Neural Machine Translation By Jointly Learning To Align And Translate
  17. 闲云野鹤:吃鸡(一)之场景制作:使用GPU instancing方式制作刷草插件
  18. C语言哈夫曼编码压缩解压
  19. maven下载jar包, 反复出现lastUpdated文件
  20. Buying Hay 购买干草 完全背包

热门文章

  1. java.lang.ClassNotFoundException: com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index
  2. 技术人员就不要当资金股东了
  3. 指向Member Function的指针
  4. python cursor游标_python 使用sqlite需要使用游标cursor?
  5. n个人围成一圈指针c语言,C语言N个人围成一圈报数用二级指针实现,不用数组!...
  6. dede rss.php,[经验]dede全站RSS订阅静态输出的办法
  7. 两边放动物对战守城的游戏_疯狂动物园小程序游戏:入口
  8. hive xmlserde_各种数据格式的Hive建表语句
  9. nginx启动vue_Docker部署前端Vue
  10. python从入门到实践答案第十章_Python编程:从入门到实践——【作业】——第十章(文件和异常)...