最近写了一个公式较复杂的报表,因梳理公式与后期的数据核对会比较耗费时间,因此采用了读取EXCEL模板,然后填写数据;最后读取最终文件生成页面的方法。现整理了将EXCEL转为HTML的方法。(本人在用的xlsx文件,颜色不支持灰色,建议使用其他背景色)

POI版本:3.17

3.8版本不支持countIfs函数

package com.tarena.kcrm.performance.util;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;/*** @功能描述 POI 读取 Excel 转 HTML 支持 03xls 和 07xlsx 版本 包含样式*/
public class POIReadExcelToHtml {/*** 测试* * @param args*/public static void pdf2html(InputStream is, String dispath) {String htmlExcel = null;Writer wr = null;try {Workbook wb = WorkbookFactory.create(is);// 此WorkbookFactory在POI-3.10版本中使用需要添加dom4jif (wb instanceof XSSFWorkbook) {XSSFWorkbook xWb = (XSSFWorkbook) wb;FormulaEvaluator eval = new XSSFFormulaEvaluator(xWb);htmlExcel = POIReadExcelToHtml.getExcelInfo(eval,xWb, true);} else if (wb instanceof HSSFWorkbook) {HSSFWorkbook hWb = (HSSFWorkbook) wb;FormulaEvaluator eval = new HSSFFormulaEvaluator(hWb);htmlExcel = POIReadExcelToHtml.getExcelInfo(eval,hWb, true);}
//          HSSFWorkbook hWb = new HSSFWorkbook(is);
//          htmlExcel = POIReadExcelToHtml.getExcelInfo(hWb, true);File file = new File(dispath);if (!file.exists()) {file.createNewFile();}wr = new FileWriter(file);wr.write(htmlExcel);} catch (Exception e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (wr != null) {wr.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 程序入口方法* * @param is*            需要转成html的文件的输入流* @param isWithStyle*            是否需要表格样式 包含 字体 颜色 边框 对齐方式* @return <table>*         ...*         </table>*         字符串*/public static String readExcelToHtml(InputStream is, boolean isWithStyle) {String htmlExcel = null;try {Workbook wb = WorkbookFactory.create(is);if (wb instanceof XSSFWorkbook) {XSSFWorkbook xWb = (XSSFWorkbook) wb;FormulaEvaluator eval = new XSSFFormulaEvaluator(xWb);htmlExcel = POIReadExcelToHtml.getExcelInfo(eval,xWb, isWithStyle);} else if (wb instanceof HSSFWorkbook) {HSSFWorkbook hWb = (HSSFWorkbook) wb;FormulaEvaluator eval = new HSSFFormulaEvaluator(hWb);htmlExcel = POIReadExcelToHtml.getExcelInfo(eval,hWb, isWithStyle);}} catch (Exception e) {e.printStackTrace();} finally {/*try {//is.close();} catch (IOException e) {e.printStackTrace();}*/}return htmlExcel;}public static String getExcelInfo(FormulaEvaluator eval , Workbook wb, boolean isWithStyle) {StringBuffer sb = new StringBuffer();Sheet sheet = wb.getSheetAt(0);// 获取第一个Sheet的内容int lastRowNum = sheet.getLastRowNum();Map<String, String> map[] = getRowSpanColSpanMap(sheet);sb.append("<table style='border-collapse:collapse;' width='1500px'>");Row row = null; // 兼容Cell cell = null; // 兼容for (int rowNum = sheet.getFirstRowNum(); rowNum <= lastRowNum; rowNum++) {row = sheet.getRow(rowNum);if (row == null) {sb.append("<tr><td > &nbsp;</td></tr>");continue;}sb.append("<tr>");int lastColNum = row.getLastCellNum();for (int colNum = 0; colNum < lastColNum; colNum++) {cell = row.getCell(colNum);if (cell == null) { // 特殊情况 空白的单元格会返回nullsb.append("<td>&nbsp;</td>");continue;}String stringValue = getCellValue(eval , cell);if (map[0].containsKey(rowNum + "," + colNum)) {String pointString = map[0].get(rowNum + "," + colNum);map[0].remove(rowNum + "," + colNum);int bottomeRow = Integer.valueOf(pointString.split(",")[0]);int bottomeCol = Integer.valueOf(pointString.split(",")[1]);int rowSpan = bottomeRow - rowNum + 1;int colSpan = bottomeCol - colNum + 1;sb.append("<td rowspan= '" + rowSpan + "' colspan= '" + colSpan + "' ");} else if (map[1].containsKey(rowNum + "," + colNum)) {map[1].remove(rowNum + "," + colNum);continue;} else {sb.append("<td ");}// 判断是否需要样式if (isWithStyle) {dealExcelStyle(wb, sheet, cell, sb);// 处理单元格样式}sb.append(">");if (stringValue == null || "".equals(stringValue.trim())) {sb.append(" &nbsp; ");} else {// 将ascii码为160的空格转换为html下的空格(&nbsp;)sb.append(stringValue.replace(String.valueOf((char) 160), "&nbsp;"));}sb.append("</td>");}sb.append("</tr>");}sb.append("</table>");return sb.toString();}@SuppressWarnings({ "unchecked", "rawtypes" })private static Map<String, String>[] getRowSpanColSpanMap(Sheet sheet) {Map<String, String> map0 = new HashMap<String, String>();Map<String, String> map1 = new HashMap<String, String>();int mergedNum = sheet.getNumMergedRegions();CellRangeAddress range = null;for (int i = 0; i < mergedNum; i++) {range = sheet.getMergedRegion(i);int topRow = range.getFirstRow();int topCol = range.getFirstColumn();int bottomRow = range.getLastRow();int bottomCol = range.getLastColumn();map0.put(topRow + "," + topCol, bottomRow + "," + bottomCol);// System.out.println(topRow + "," + topCol + "," + bottomRow + ","// + bottomCol);int tempRow = topRow;while (tempRow <= bottomRow) {int tempCol = topCol;while (tempCol <= bottomCol) {map1.put(tempRow + "," + tempCol, "");tempCol++;}tempRow++;}map1.remove(topRow + "," + topCol);}Map[] map = { map0, map1 };return map;}/*** 获取表格单元格Cell内容* * @param cell* @return*/public static String getCellValue(FormulaEvaluator eval,Cell cell) {String result = new String();switch (cell.getCellType()) {case Cell.CELL_TYPE_NUMERIC:// 数字类型if (DateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式SimpleDateFormat sdf = null;if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {sdf = new SimpleDateFormat("HH:mm");} else {// 日期sdf = new SimpleDateFormat("yyyy-MM-dd");}Date date = cell.getDateCellValue();result = sdf.format(date);} else if (cell.getCellStyle().getDataFormat() == 58) {// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");double value = cell.getNumericCellValue();Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);result = sdf.format(date);} else {double value = cell.getNumericCellValue();CellStyle style = cell.getCellStyle();DecimalFormat format = new DecimalFormat();String temp = style.getDataFormatString();// 单元格设置成常规if (temp.equals("General")) {format.applyPattern("#");}result = format.format(value);}break;case Cell.CELL_TYPE_STRING:// String类型result = cell.getRichStringCellValue().toString();break;case Cell.CELL_TYPE_BLANK:result = "";break;case Cell.CELL_TYPE_FORMULA: //公式类型// cell.getCellFormula();DecimalFormat df = new DecimalFormat("#,###");try {//四舍五入取整//System.out.println("行:"+cell.getRowIndex() +"第"+cell.getColumnIndex() + "列:"+cell.getCellFormula());eval.evaluateFormulaCell(cell);double value = new BigDecimal(cell.getNumericCellValue()).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();//千分位显示result = String.valueOf(df.format(value));    } catch (IllegalStateException e) {result = String.valueOf(cell.getRichStringCellValue());}//DecimalFormat df=new DecimalFormat("0");//df.format(result);break;default:result = "";break;}return result;}/*** 处理表格样式* * @param wb* @param sheet* @param cell* @param sb*/private static void dealExcelStyle(Workbook wb, Sheet sheet, Cell cell, StringBuffer sb) {CellStyle cellStyle = cell.getCellStyle();if (cellStyle != null) {short alignment = cellStyle.getAlignment();sb.append("align='" + convertAlignToHtml(alignment) + "' ");// 单元格内容的水平对齐方式short verticalAlignment = cellStyle.getVerticalAlignment();sb.append("valign='" + convertVerticalAlignToHtml(verticalAlignment) + "' ");// 单元格中内容的垂直排列方式if (wb instanceof XSSFWorkbook) {XSSFFont xf = ((XSSFCellStyle) cellStyle).getFont();short boldWeight = 1;// xf.getBoldweight();sb.append("style='");sb.append("font-weight:" + boldWeight + ";"); // 字体加粗sb.append("font-size: " + xf.getFontHeight() / 2 + "%;"); // 字体大小int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());sb.append("width:" + columnWidth + "px;");XSSFColor xc = xf.getXSSFColor();if (xc != null && !"".equals(xc)) {sb.append("color:#" + xc.getARGBHex().substring(2) + ";"); // 字体颜色}XSSFColor bgColor = (XSSFColor) cellStyle.getFillForegroundColorColor();// System.out.println("************************************");// System.out.println("BackgroundColorColor: "+cellStyle.getFillBackgroundColorColor());// System.out.println("ForegroundColor: "+cellStyle.getFillForegroundColor());//0// System.out.println("BackgroundColorColor: "+cellStyle.getFillBackgroundColorColor());// System.out.println("ForegroundColorColor: "+cellStyle.getFillForegroundColorColor());// String bgColorStr = bgColor.getARGBHex();// System.out.println("bgColorStr: "+bgColorStr);if (bgColor != null && !"".equals(bgColor)) {sb.append("background-color:#" + bgColor.getARGBHex().substring(2) + ";"); // 鑳屾櫙棰滆壊}sb.append(getBorderStyle(0, cellStyle.getBorderTop(), ((XSSFCellStyle) cellStyle).getTopBorderXSSFColor()));sb.append(getBorderStyle(1, cellStyle.getBorderRight(), ((XSSFCellStyle) cellStyle).getRightBorderXSSFColor()));sb.append(getBorderStyle(2, cellStyle.getBorderBottom(), ((XSSFCellStyle) cellStyle).getBottomBorderXSSFColor()));sb.append(getBorderStyle(3, cellStyle.getBorderLeft(), ((XSSFCellStyle) cellStyle).getLeftBorderXSSFColor()));} else if (wb instanceof HSSFWorkbook) {HSSFFont hf = ((HSSFCellStyle) cellStyle).getFont(wb);short boldWeight = 1;// hf.getBoldweight();short fontColor = hf.getColor();sb.append("style='");HSSFPalette palette = ((HSSFWorkbook) wb).getCustomPalette(); // 绫籋SSFPalette鐢ㄤ簬姹傜殑棰滆壊鐨勫浗闄呮爣鍑嗗舰寮�HSSFColor hc = palette.getColor(fontColor);sb.append("font-weight:" + boldWeight + ";"); // 瀛椾綋鍔犵矖sb.append("font-size: " + hf.getFontHeight() / 2 + "%;"); // 瀛椾綋澶у皬String fontColorStr = convertToStardColor(hc);if (fontColorStr != null && !"".equals(fontColorStr.trim())) {sb.append("color:" + fontColorStr + ";"); // 瀛椾綋棰滆壊}int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());sb.append("width:" + columnWidth + "px;");short bgColor = cellStyle.getFillForegroundColor();hc = palette.getColor(bgColor);String bgColorStr = convertToStardColor(hc);if (bgColorStr != null && !"".equals(bgColorStr.trim())) {sb.append("background-color:" + bgColorStr + ";"); // 鑳屾櫙棰滆壊}sb.append(getBorderStyle(palette, 0, cellStyle.getBorderTop(), cellStyle.getTopBorderColor()));sb.append(getBorderStyle(palette, 1, cellStyle.getBorderRight(), cellStyle.getRightBorderColor()));sb.append(getBorderStyle(palette, 3, cellStyle.getBorderLeft(), cellStyle.getLeftBorderColor()));sb.append(getBorderStyle(palette, 2, cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor()));}sb.append("' ");}}/*** 单元格内容的水平对齐方式* * @param alignment* @return*/private static String convertAlignToHtml(short alignment) {String align = "left";// switch (alignment) {// case CellStyle.ALIGN_LEFT:// align = "left";// break;// case CellStyle.ALIGN_CENTER:// align = "center";// break;// case CellStyle.ALIGN_RIGHT:// align = "right";// break;// default:// break;// }return align;}/*** 单元格中内容的垂直排列方式* * @param verticalAlignment* @return*/private static String convertVerticalAlignToHtml(short verticalAlignment) {String valign = "middle";// switch (verticalAlignment) {// case CellStyle.VERTICAL_BOTTOM:// valign = "bottom";// break;// case CellStyle.VERTICAL_CENTER:// valign = "center";// break;// case CellStyle.VERTICAL_TOP:// valign = "top";// break;// default:// break;// }return valign;}private static String convertToStardColor(HSSFColor hc) {StringBuffer sb = new StringBuffer("");if (hc != null) {if (HSSFColor.AUTOMATIC.index == hc.getIndex()) {return null;}sb.append("#");for (int i = 0; i < hc.getTriplet().length; i++) {sb.append(fillWithZero(Integer.toHexString(hc.getTriplet()[i])));}}return sb.toString();}private static String fillWithZero(String str) {if (str != null && str.length() < 2) {return "0" + str;}return str;}static String[] bordesr = { "border-top:", "border-right:", "border-bottom:", "border-left:" };static String[] borderStyles = { "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid", "solid","solid", "solid", "solid" };private static String getBorderStyle(HSSFPalette palette, int b, short s, short t) {if (s == 0) {return bordesr[b] + borderStyles[s] + "#d0d7e5 1px;";};String borderColorStr = convertToStardColor(palette.getColor(t));borderColorStr = borderColorStr == null || borderColorStr.length() < 1 ? "#000000" : borderColorStr;return bordesr[b] + borderStyles[s] + borderColorStr + " 1px;";}private static String getBorderStyle(int b, short s, XSSFColor xc) {if (s == 0) {return bordesr[b] + borderStyles[s] + "#d0d7e5 1px;";};if (xc != null && !"".equals(xc)) {String borderColorStr = xc.getARGBHex();// t.getARGBHex();borderColorStr = borderColorStr == null || borderColorStr.length() < 1 ? "#000000" : borderColorStr.substring(2);return bordesr[b] + borderStyles[s] + borderColorStr + " 1px;";}return "";}}

读取excel文件转为HTML相关推荐

  1. python转csv_python脚本如何将Excel文件转为csv文件(代码)

    本篇文章给大家带来的内容是关于python脚本如何将Excel文件转为csv文件(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.#!/usr/bin/env python __ ...

  2. python csv转excel_将Excel文件转为csv文件的python脚本

    将Excel文件转为csv文件的python脚本 #!/usr/bin/env python __author__ = "lrtao2010" ''' Excel文件转csv文件脚 ...

  3. php循环读取excel每个单元格,php使用PHPexcel类读取excel文件(循环读取每个单元格的数据)...

    error_reporting(E_ALL); date_default_timezone_set('Asia/ShangHai'); include_once('Classes/PHPExcel/I ...

  4. php打开excel文件,PHP读取Excel文件的简单示例

    这篇文章主要为大家详细介绍了PHP读取Excel文件的简单示例,具有一定的参考价值,可以用来参考一下. 对PHP读取Excel文件感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 涉及知识 ...

  5. 读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件

    读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件 工作中涉及很多提供文档数据,少则几条,多则上万,少的可以自己编辑一个,静态final来自己定义,一旦数太多得话,就得使用 ...

  6. php读取excel文件的数据,如何使用php获取excel文件数据

    如何使用php获取excel文件数据 文章主要介绍了php获取excel文件数据的方法.具有很好的参考价值.下面跟着小编一起来看下吧. 1.下载PHPExcel类,是一个文件夹,还得有一个文件PHPE ...

  7. php把excel变成数组,PHP excel读取excel文件转换为数组

    /* 备注:先去下载PHP EXCEL--http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=phpexcel&a ...

  8. python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

    在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...

  9. C#读取Excel文件,准换为list

    经常会用到,废话不多说直接贴代码 //读取Excel文件 public static DataTable ReadExcelToTable(string path)//excel存放的路径 { try ...

最新文章

  1. 安卓constraintLayout中app:srcCompat设置的图片显示不出来
  2. python中的排序方法都有哪些_几种常见的排序方法总结(Python)
  3. linux HZ Tick Jiffies
  4. leetcode-71-简化路径
  5. markdown写法
  6. MicroStation V8i简体中文版中文字体乱码解决办法
  7. [蓝桥杯2018初赛]第几个幸运数-数论+枚举
  8. groupwise_GroupWise部分文档翻译
  9. 30款非常酷的创意名片设计欣赏
  10. java栈空异常_Java如何处理空堆栈异常?
  11. Eclipse、IntelliJ IDEA、TortoiseSVN清除svn帐号
  12. AntD Selected 多选
  13. matlab 传函将s换为jw,2010MATLAB及控制系统仿真_总复习.ppt
  14. Java多线程--概述-转自Kyrie lrving
  15. 百位红人助阵,如涵这场影响力盛典点亮夜钱塘
  16. Unity实用案例之——屏幕画线和线框渲染
  17. 2021年总结 2022年展望
  18. Hadoop学习笔记(一)
  19. 2021年茶艺师(中级)最新解析及茶艺师(中级)考试总结
  20. 【计算机毕业设计选题】10套易过的精品毕设项目分享(源码+论文)

热门文章

  1. 游戏本天梯_降维打击,打败对手也伤了自家兄弟(笔记本CPU天梯V5.20)
  2. [渗透测试学习靶机05] vulnhub靶场 DarkHole: 2
  3. 二维点云ICP原理推导
  4. 产品推广合作扁平化通用PPT模板
  5. python线性方程组求解_python求解方程组的三种方法
  6. 实习周记1(sdk了解、fiddler抓包、反编译工具)
  7. java umeditor使用,百度UMeditor富文本编辑器java使用
  8. java中jcl,从批处理JCL执行java
  9. 本地用户与组账户的管理、组策略
  10. 理解synchronized的含义