基于poi3.14做的excel(.xlsx)转html的功能

这篇博客介绍了如何利用Apache POI 3.14库来实现Excel(.xlsx格式)转换为HTML的功能。作者从官方SVN获取了示例代码,并展示了核心转换代码和所需的依赖。此外,还提及了转换过程中使用的默认样式表excelStyle.css。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于业务需求,需要实现一个表格转网页的接口。限于时间,从apache的官方例子SVN了一份相关代码作为起草。

调试点包括:颜色兼容问题、单元格合并、文字不能换行bug、单元格宽度精准计算(通过字体)。
乱码问题:统一以GBK格式输出即可,见 测试代码

修复Bug :
单元格绘制异常(2016/9/6):增加了一个HashSet存放没有值的点。默认打印一个TD。另外(x,y)也校正了,原来的x对应row,现对应colum。
更新(2016/9/7):
支持隐藏CELL。字体样式优化了。 补充了CELL内回车支持。
更新:(2016/9/11)
支持读取每个CELL里的richString。 修复了垂直高度的BUG。 不再支持XLS,,唯一支持XLSX。


说明 :
只输出打开EXCELL看到的sheet。
表格左上边框代码已被注掉需要的自行添加。
XSSF下的color 的 rgba的中a 我是用color.index(隐bug,应该有误)。由于getARGB方法调试失败就敷衍了下,以防数组越界。
row.getLastCellNum()的方法默认+1,防坑 .
在计算宽度的时候先计算当前字体的宽高。注意使用pt。分清pt与px的概念。
width = cell.getSheet().getColumnWidth(cell.getColumnIndex())/256*font.getFontHeight()/20+"pt"

关于单元合合并、重点说下思路:
首先将所有的单元格视为Point点,x为RawNum,y为columNum。将merged(被合并的格子),以(x,y)的形式存放进HashSet。
然后再进行分类:合并的Cell只需要渲染一次,其余的不必渲染(打印td)。
由于单元合合并,可能有的行所有的cell都为null,注意此时补一个 <td > &nbsp;</td>。以防少显示一行。
调试后如下。

测试代码如下

package test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import org.apache.poi.ss.html.modified.ToHtml;

public class Tohtml {

	public static void main(String[] args) throws IOException {
		//!!以GBK输出
	     ToHtml toHtml = ToHtml.create("C:\\Users\\Administrator.R1CB3GIDDYDKUPO\\Desktop\\工作流.xlsx", new PrintWriter(new File("D:\\out.html"),"gbk"));
	     toHtml.setCompleteHTML(true);
	     toHtml.printPage();

	}

}

主要功能代码

package org.apache.poi.ss.html.modifie;

import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_CENTER;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_CENTER_SELECTION;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_FILL;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_GENERAL;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_JUSTIFY;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_LEFT;
import static org.apache.poi.ss.usermodel.CellStyle.ALIGN_RIGHT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_DASHED;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_DASH_DOT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_DASH_DOT_DOT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_DOTTED;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_DOUBLE;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_HAIR;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_MEDIUM;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_MEDIUM_DASHED;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_MEDIUM_DASH_DOT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_MEDIUM_DASH_DOT_DOT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_NONE;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_SLANTED_DASH_DOT;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_THICK;
import static org.apache.poi.ss.usermodel.CellStyle.BORDER_THIN;
import static org.apache.poi.ss.usermodel.CellStyle.VERTICAL_BOTTOM;
import static org.apache.poi.ss.usermodel.CellStyle.VERTICAL_CENTER;
import static org.apache.poi.ss.usermodel.CellStyle.VERTICAL_TOP;

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值