由于业务需求,需要实现一个表格转网页的接口。限于时间,从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 > </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