poi excel文件转换为html文件,实现在线预览

excel文件包含图片转换为html还没实现

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.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.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.maiyue.base.utils.FileUtils;

/**
 * excel文件转换为html
 *
 * @author cwl
 *
 */
public class POIExcelToHtmlUtils {
 
 private static Logger logger = LoggerFactory.getLogger(POIExcelToHtmlUtils.class);

 /**
  *
  * @param sourceFilePath
  * @param targetFilePath
  * @return
  */
 public static String excelToHtml(String sourceFilePath, String targetFilePath) {
  FileUtils.createFileFolder(targetFilePath);
  InputStream is = null;
  String htmlExcel = null;
  try {
   File sourcefile = new File(sourceFilePath);
   is = new FileInputStream(sourcefile);
   Workbook wb = WorkbookFactory.create(is);
   if (wb instanceof XSSFWorkbook) {
    XSSFWorkbook xWb = (XSSFWorkbook) wb;
    htmlExcel = POIExcelToHtmlUtils.getExcelInfo(xWb, true);
   } else if (wb instanceof HSSFWorkbook) {
    HSSFWorkbook hWb = (HSSFWorkbook) wb;
    htmlExcel = POIExcelToHtmlUtils.getExcelInfo(hWb, true);
   }
   if (StringUtils.isNotBlank(htmlExcel)) {
    FileUtils.writeToFile(htmlExcel, targetFilePath, "gbk");
    return targetFilePath;
   } else {
    return null;
   }
   
  } catch (Exception e) {
   logger.error("excel文档转换为html,发生异常,源文件={},目标文件={}", sourceFilePath, targetFilePath, e);
   return null;
  } finally {
   try {
    is.close();
   } catch (IOException e) {
    logger.error("excel文档转换为html,关闭流发生异常,源文件={},目标文件={}", sourceFilePath, targetFilePath, e);
    return null;
   }
  }
 }

 /**
  *
  * @param wb
  * @param isWithStyle
  * @return
  */
 private static String getExcelInfo(Workbook wb, boolean isWithStyle) {
  StringBuffer sb = new StringBuffer();
  int sheetCounts = wb.getNumberOfSheets();

  for (int i = 0; i < sheetCounts; i++) {
   Sheet sheet = wb.getSheetAt(i);
   int lastRowNum = sheet.getLastRowNum();
   Map<String, String> map[] = getRowSpanColSpanMap(sheet);
   sb.append("<br><br>");
   sb.append(sheet.getSheetName());
   sb.append("<table style='border-collapse:collapse;' 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 > &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) {
      sb.append("<td>&nbsp;</td>");
      continue;
     }

     String stringValue = getCellValue(cell);
     //System.out.println("-===="+stringValue);
     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 (StringUtils.isBlank(stringValue)) {
      sb.append(" &nbsp; ");
     } else {
      sb.append(stringValue.replace(String.valueOf((char) 160), "&nbsp;"));
     }
     sb.append("</td>");
    }
    sb.append("</tr>");
   }
   sb.append("</table>");
  }

扫描二维码关注公众号,回复: 2215130 查看本文章

  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;
 }

 /**
  *
  * @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) {
    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:
   // cell.getRichStringCellValue().toString()
   result = String.valueOf(cell.getStringCellValue());;
   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) + "' ");

   if (wb instanceof XSSFWorkbook) {
    XSSFFont xf = ((XSSFCellStyle) cellStyle).getFont();
    short boldWeight = 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();
    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();
    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" };

 /**
  *
  * @param palette
  * @param b
  * @param s
  * @param t
  * @return
  */
 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;";
 }

 /**
  *
  * @param b
  * @param s
  * @param xc
  * @return
  */
 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 "";
 }
 
 /*public static void main(String[] args) {
  POIExcelToHtmlUtils.excelToHtml("D:/diagnosis/file/temp/excel2007.xlsx", "D:/diagnosis/file/temp/test13.html");
  POIExcelToHtmlUtils.excelToHtml("D:/diagnosis/file/temp/excel2003.xls", "D:/diagnosis/file/temp/test14.html");
 }*/

}

猜你喜欢

转载自blog.csdn.net/m0_37615697/article/details/81083952