zoukankan      html  css  js  c++  java
  • excel转换html

    利用POI解析excel,转换成html,支持各种版本的excel、支持自定义样式、支持行列合并

    需要用到的jar

    public class Excel2Html {

    /**
    * 读取Excel并转换成html
    * @param filePath 需要转换的excel文件路径
    * @param htmlPostion 转换后html存放路径
    * @param isWithStyle 是否需要样式
    * @param theme 主题(1--深色背景;2--浅色背景)
    * @return
    */
    public static String readExcelToHtml(String filePath, String htmlPostion, boolean isWithStyle, int theme) {
    InputStream is = null;
    String htmlExcel = null;
    try {
    File sourceFile = new File(filePath);
    is = new FileInputStream(sourceFile);
    Workbook wb = WorkbookFactory.create(is);

    if(wb instanceof HSSFWorkbook) {//03版excel处理方法
    HSSFWorkbook hwb = (HSSFWorkbook)wb;
    htmlExcel = Excel2Html.getExcelInfo(hwb,isWithStyle, theme);
    } else {//07以及10版本以后的excel处理方法
    XSSFWorkbook xwb = (XSSFWorkbook)wb;
    htmlExcel = Excel2Html.getExcelInfo(xwb, isWithStyle, theme);
    }
    writeFile(htmlExcel, htmlPostion, theme);
    } catch(Exception e) {
    e.printStackTrace();
    } finally {
    try {
    is.close();
    } catch(IOException e) {
    e.printStackTrace();
    }
    }

    return htmlExcel;
    }

    /**
    *
    * @param wb
    * @param isWithStyle 是否需要样式
    * @param theme 主题(1--深色背景;2--浅色背景)
    * @return
    */
    private static String getExcelInfo(Workbook wb, boolean isWithStyle, int theme) {
    StringBuffer sb = new StringBuffer();
    Sheet sheet = wb.getSheetAt(0);//获取第一个Sheet的内容
    int lastRowNum = sheet.getLastRowNum();
    Map<String, String> map[] = getRowSpanColSpanMap(sheet);
    if(theme == 1) {
    //深色背景样式
    sb.append("<table style='border-collapse:collapse;background: #263B5C;' width='100%'>");
    } else if(theme == 2) {
    //浅色背景样式
    sb.append("<table style='border-collapse:collapse;background: #fffff;' width='100%'>");
    }
    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 ><nobr> </nobr></td></tr>");
    continue;
    }
    sb.append("<tr>");
    int lastColNum = row.getLastCellNum();
    for(int colNum = 0; colNum < lastColNum; colNum++) {
    cell = row.getCell(colNum);
    if(cell == null) {
    sb.append("<td></td>");
    continue;
    }

    String stringValue = getCellValue(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("><nobr>");
    if(stringValue == null || "".equals(stringValue.trim())) {
    sb.append(" ");
    } else {
    //将ascii码为160的空格转换为html下的空格
    sb.append(stringValue.replace(String.valueOf((char) 160)," "));
    }
    sb.append("</nobr></td>");
    }
    sb.append("</tr>");
    }
    sb.append("</table>");
    return sb.toString();
    }

    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);
    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
    */
    private static String getCellValue(Cell cell) {
    String result = new String();
    switch(cell.getCellType()) {
    case Cell.CELL_TYPE_NUMERIC://数字类型
    if(HSSFDateUtil.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;
    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)+ "' ");//单元格中内容的垂直排列方式
    sb.append("valign='center' ");//单元格中内容的垂直排列方式
    if(wb instanceof XSSFWorkbook) {
    XSSFFont xf = ((XSSFCellStyle)cellStyle).getFont();
    short boldWeight = xf.getBoldweight();
    String align = convertAlignToHtml(alignment);
    sb.append("style='");
    sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
    //sb.append("font-size: " + xf.getFontHeight() / 2 + "%;"); // 字体大小
    sb.append("font-size: 14px;"); // 字体大小
    int columnWidth = sheet.getColumnWidth(cell.getColumnIndex()) ;
    sb.append("" + columnWidth + "px;");
    sb.append("text-align:" + align + ";");//表头排版样式
    XSSFColor xc = xf.getXSSFColor();
    if (xc != null && !"".equals(xc)) {
    sb.append("color:#" + xc.getARGBHex().substring(2) + ";"); // 字体颜色
    }
    XSSFColor bgColor = (XSSFColor) cellStyle.getFillForegroundColorColor();
    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 = hf.getBoldweight();
    short fontColor = hf.getColor();
    sb.append("style='");
    HSSFPalette palette = ((HSSFWorkbook) wb).getCustomPalette(); // 类HSSFPalette用于求的颜色的国际标准形式
    HSSFColor hc = palette.getColor(fontColor);
    sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
    //sb.append("font-size: " + hf.getFontHeight() / 2 + "%;"); // 字体大小
    sb.append("font-size: 14px;"); // 字体大小
    String align = convertAlignToHtml(alignment);
    sb.append("text-align:" + align + ";");//表头排版样式
    String fontColorStr = convertToStardColor(hc);
    if (fontColorStr != null && !"".equals(fontColorStr.trim())) {
    sb.append("color:" + fontColorStr + ";"); // 字体颜色
    }
    int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());
    sb.append("" + 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 = "center";
    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] + "#5a6882 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] + "#5a6882 1px;";
    }
    if(xc != null && !"".equals(xc)) {
    String borderColorStr = xc.getARGBHex();
    borderColorStr=borderColorStr == null|| borderColorStr.length() < 1 ? "#000000" : borderColorStr.substring(2);
    return bordesr[b] + borderStyles[s] + borderColorStr + " 1px;";
    }

    return "";
    }

    /**
    * 将内容写进html
    * @param content html内容
    * @param htmlPath html路径
    * @param theme 主题(1--深色背景;2--浅色背景)
    */
    private static void writeFile(String content, String htmlPath, int theme) {
    File file = new File(htmlPath);
    StringBuilder sb = new StringBuilder();
    try {
    file.createNewFile();//创建文件
    sb.append("<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Html Test</title></head>");
    if(theme == 1) {
    //深色背景样式
    sb.append("<style>tr {height: 50px;} nobr {color: #fff;}</style>");
    } else {
    //浅色背景样式
    sb.append("<style>tr {height: 50px;} nobr {color: #515f6d;}</style>");
    }
    sb.append("<body>");
    sb.append("<div>");
    sb.append(content);
    sb.append("</div>");
    sb.append("</body></html>");

    PrintStream printStream = new PrintStream(new FileOutputStream(file));
    printStream.println(sb.toString());//将字符串写入文件
    } catch(IOException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String str = "整车进口数量年度统计.xlsx";
    System.out.println(str.split("\.")[0]);
    //Excel2Html.readExcelToHtml("E:/testFile/整车进口数量年度统计.xlsx", "E:/testFile/整车进口数量年度统计.html", true, 1);
    //Excel2Html.readExcelToHtml("E:/testFile/商务办单量统计.xlsx", "E:/testFile/商务办单量统计.html", true, 1);
    }
    }

  • 相关阅读:
    Linux CPU监控指标
    Elasticsearch强大的聚合功能Facet
    业务逻辑层的设计
    数据结构中的棧在C#中的实现
    使用WPF教你一步一步实现连连看
    ASP.NET之旅—再一次与ASP谋面
    每日一帖示例程序(使用TWebBrowser基于HTML做)
    在程序异常中记录堆栈信息(使用ExWatcher)
    获取TBitMap图像缓冲区,提高图像处理速度
    delphi实现穿XP防火墙
  • 原文地址:https://www.cnblogs.com/vofill/p/10145471.html
Copyright © 2011-2022 走看看