将html table 转成 excel
- package com.sun.office.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;// 跨越列数
- int getFirstRow() {
- return firstRowIndex;
- }
- int getLastRow() {
- return firstRowIndex + rowSpan - 1;
- }
- int getFirstCol() {
- return firstColIndex;
- }
- int getLastCol() {
- return firstColIndex + colSpan - 1;
- }
- int getColSpan(){
- return colSpan;
- }
- }
- package com.sun.office.excel;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- 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.HSSFColor;
- import org.apache.poi.ss.util.CellRangeAddress;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- /**
- * 将html table 转成 excel
- *
- * 记录下来所占的行和列,然后填充合并
- */
- public class ConvertHtml2Excel {
- public static void main(String[] args) {
- byte[] bs = null;
- try {
- FileInputStream fis = new FileInputStream(new File(ConvertHtml2Excel.class.getResource("./a.html").getPath()));
- bs = new byte[fis.available()];
- fis.read(bs);
- fis.close();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- String c = new String(bs);
- HSSFWorkbook wb = table2Excel(c);
- try {
- FileOutputStream fos = new FileOutputStream(new File("1.xls"));
- wb.write(fos);
- fos.flush();
- fos.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 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);
- if (thead != null) {
- List<Element> trLs = thead.elements("tr");
- for (Element trEle : trLs) {
- HSSFRow row = sheet.createRow(rowIndex);
- List<Element> thLs = trEle.elements("th");
- makeRowCell(thLs, rowIndex, row, 0, titleStyle, crossRowEleMetaLs);
- rowIndex++;
- }
- }
- // 生成表体
- Element tbody = data.getRootElement().element("tbody");
- if (tbody != null) {
- HSSFCellStyle contentStyle = getContentStyle(wb);
- 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()));
- }
- } 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);
- }
- c.setCellStyle(cellStyle);
- int rowSpan = NumberUtils.toInt(thEle.attributeValue("rowspan"), 1);
- int colSpan = NumberUtils.toInt(thEle.attributeValue("colspan"), 1);
- 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;
- }
- /**
- * 获得因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((short) 1);
- style.setBorderTop((short) 1);
- style.setBorderLeft((short) 1);
- style.setBorderRight((short) 1);
- 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);
- return style;
- }
- }
基本思路:
逐行遍历,记录下单元格所占的行和列,根据行列去填充空格,合并单元格
将html table 转成 excel的更多相关文章
- MVC 将视图页table导出成excel
前台代码: <table class="tablelist" id="myTable"> <thead> <t ...
- js实现把网页table导成Excel
//导出excel function exportExcel(DivID,strTitle){ if(DivID==null) { return false; } var jXls, myWorkbo ...
- js实现把网页table导成Excel(bootstrap、JqGrid、Json)
方案一:支持IE //导出excel function exportExcel(DivID,strTitle){ if(DivID==null) { return false; } var jXls, ...
- js中的table导出成Excel表格
首先判断手否是IE,原因在于IE导出我用的是ActiveXObject,判断的方式很简单,只需要拿到window.navigator.userAgent即可进行判断,代码如下 function get ...
- C#将html table 导出成excel实例
public void ProcessRequest (HttpContext context) { string elxStr = "<table><tbody>& ...
- 前端Table数据导出Excel使用HSSFWorkbook(Java)
一.实现原理: 1. 前端查询列表数据并渲染至table(<table>...</table>)表格 2. 表格html代码传输至后台 3. 后台把html转成Excel输出流 ...
- web利用table表格生成excel格式问题
当我们把web页面上的table导成excel形式时,有时候我们的数据需要以特定的格式呈现出来,这时候我们就需要给指定的单元格添加一些样式规格信息. 文本:vnd.ms-excel.numberfor ...
- Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"
Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...
- 【ASP.NET】C# 将HTML中Table导出到Excel(TableToExcel)
首先,说下应用场景 就是,把页面呈现的Table 导出到Excel中.其中使用的原理是 前台使用ajax调用aspx后台,传递过去参数值,导出.使用的组件是NPOI. 前台调用: <script ...
随机推荐
- memcached内存模型
内存管理 内存结构 把内存划分成不同的slab class仓库 把仓库切分成不同尺寸的小块(chunk),用来存储缓存数据 数据内存分配 首先根据数据的大小找到对应的slab class 找到空闲的c ...
- SQL Server中字段类型对应的C#中的数据类型
数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean cha ...
- web前端学习(2):开始编写HTML
在第一章中,我们初步了解了上网的过程,同时也明白了所谓网页,其本质就是主要用HTML语言所写的一份文档.相信大多数人在了解HTML文件前,最先接触的是利用"记事本"所写的文档或者是 ...
- Linux - ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
启动ubuntu,以root用户登陆,打开命令行终端 输入命令:#vim /root/.profile 找到.profile文件中的mesg n 将其替换成tty -s && mesg ...
- Effective Java 第三版——28. 列表优于数组
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- strman--java8字符串工具类
strman-java 是Java8的字符串处理库,它的灵感来自 dleitee/strman . Strmen-java 是一个字符串处理工具,你可以通过 maven 将它引入到项目中.除了 Jav ...
- linux_操作系统
如何查询操作系统版本? cat /etc/redhat-release 什么是操作系统? -- win10,linux都是os,应用软件和硬件打交道中间桥梁软件,管理 硬件+软件 资源,计算机系统基础 ...
- python_19_异常处理
什么是异常处理? -- 对于用户输入,不想让用户看见出错信息,对异常进行处理 异常处理的框架是什么? try: 可能出错的程序1 可能出错的程序2 #程序1出错了,不在执行程序2 exc ...
- Log4j源码解析--核心类解析
原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...
- PHP date()函数详解
date (PHP 4, PHP 5) date - 格式化一个本地时间/日期 说明¶ string date ( string $format [, int $timestamp ] ) 返回将整数 ...