excel转html 实现在线预览

首先说一下,本人发布的代码都是经过本人亲测,并且用在实际项目中。如果觉得可以,希望大家点个赞,谢谢大家。

有什么问题,大家评论出来,一起交流。好了,不废话了,下面来说一说这个东西怎么做。

网上也有许多版本,不过都不是我想要的,转出的html文件,要带表格,而且还能根据excel文件样式来生成html文件,不过太复杂的样式就支持不太强大了。

我采用poi去做这个功能,虽然还有jxl等其它方式,其它方式都有大的缺陷,有的不支持excel07版本,有的不能跨平台使用,这些都是很致命的缺点。

所以我采用poi去研究,我测试office和wps的excel版本都支持,并且兼容excel03及07以后版本,效果达到我的要求了,下面贴出源码,供大家一起学习。

jar包主要是这些 

  1
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
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;
  /**
  2
  3           * @param filePath excel源文件文件的路径
  4           * @param htmlPositon 生成的html文件的路径
  5           * @param isWithStyle 是否需要表格样式 包含 字体 颜色 边框 对齐方式
  6
  7           */
  8          public static String readExcelToHtml(String filePath ,String htmlPositon, boolean isWithStyle){
  9
 10              InputStream is = null;
 11              String htmlExcel = null;
 12              try {
 13                  File sourcefile = new File(filePath);
 14                  is = new FileInputStream(sourcefile);
 15                  Workbook wb = WorkbookFactory.create(is);
 16                  if (wb instanceof XSSFWorkbook) {   //03版excel处理方法
 17                      XSSFWorkbook xWb = (XSSFWorkbook) wb;
 18                      htmlExcel = FileConverter.getExcelInfo(xWb,isWithStyle);
 19                  }else if(wb instanceof HSSFWorkbook){  //07及10版以后的excel处理方法
 20                      HSSFWorkbook hWb = (HSSFWorkbook) wb;
 21                      htmlExcel = FileConverter.getExcelInfo(hWb,isWithStyle);
 22                  }
 23                  writeFile(htmlExcel,htmlPositon);
 24              } catch (Exception e) {
 25                  e.printStackTrace();
 26              }finally{
 27                  try {
 28                      is.close();
 29                  } catch (IOException e) {
 30                      e.printStackTrace();
 31                  }
 32              }
 33              return htmlPositon;
 34          }
 35
 36
 37
 38          private static String getExcelInfo(Workbook wb,boolean isWithStyle){
 39
 40              StringBuffer sb = new StringBuffer();
 41              Sheet sheet = wb.getSheetAt(0);//获取第一个Sheet的内容
 42              int lastRowNum = sheet.getLastRowNum();
 43              Map<String, String> map[] = getRowSpanColSpanMap(sheet);
 44              sb.append("<table style=‘border-collapse:collapse;‘ width=‘100%‘>");
 45              Row row = null;        //兼容
 46              Cell cell = null;    //兼容
 47
 48              for (int rowNum = sheet.getFirstRowNum(); rowNum <= lastRowNum; rowNum++) {
 49                  row = sheet.getRow(rowNum);
 50                  if (row == null) {
 51                      sb.append("<tr><td ><nobr> </nobr></td></tr>");
 52                      continue;
 53                  }
 54                  sb.append("<tr>");
 55                  int lastColNum = row.getLastCellNum();
 56                  for (int colNum = 0; colNum < lastColNum; colNum++) {
 57                      cell = row.getCell(colNum);
 58                      if (cell == null) {    //特殊情况 空白的单元格会返回null
 59                          sb.append("<td> </td>");
 60                          continue;
 61                      }
 62
 63                      String stringValue = getCellValue(cell);
 64                      if (map[0].containsKey(rowNum + "," + colNum)) {
 65                          String pointString = map[0].get(rowNum + "," + colNum);
 66                          map[0].remove(rowNum + "," + colNum);
 67                          int bottomeRow = Integer.valueOf(pointString.split(",")[0]);
 68                          int bottomeCol = Integer.valueOf(pointString.split(",")[1]);
 69                          int rowSpan = bottomeRow - rowNum + 1;
 70                          int colSpan = bottomeCol - colNum + 1;
 71                          sb.append("<td rowspan= ‘" + rowSpan + "‘ colspan= ‘"+ colSpan + "‘ ");
 72                      } else if (map[1].containsKey(rowNum + "," + colNum)) {
 73                          map[1].remove(rowNum + "," + colNum);
 74                          continue;
 75                      } else {
 76                          sb.append("<td ");
 77                      }
 78
 79                      //判断是否需要样式
 80                      if(isWithStyle){
 81                          dealExcelStyle(wb, sheet, cell, sb);//处理单元格样式
 82                      }
 83
 84                      sb.append("><nobr>");
 85                      if (stringValue == null || "".equals(stringValue.trim())) {
 86                          sb.append("   ");
 87                      } else {
 88                          // 将ascii码为160的空格转换为html下的空格( )
 89                          sb.append(stringValue.replace(String.valueOf((char) 160)," "));
 90                      }
 91                      sb.append("</nobr></td>");
 92                  }
 93                  sb.append("</tr>");
 94              }
 95
 96              sb.append("</table>");
 97              return sb.toString();
 98          }
 99
100          private static Map<String, String>[] getRowSpanColSpanMap(Sheet sheet) {
101
102              Map<String, String> map0 = new HashMap<String, String>();
103              Map<String, String> map1 = new HashMap<String, String>();
104              int mergedNum = sheet.getNumMergedRegions();
105              CellRangeAddress range = null;
106              for (int i = 0; i < mergedNum; i++) {
107                  range = sheet.getMergedRegion(i);
108                  int topRow = range.getFirstRow();
109                  int topCol = range.getFirstColumn();
110                  int bottomRow = range.getLastRow();
111                  int bottomCol = range.getLastColumn();
112                  map0.put(topRow + "," + topCol, bottomRow + "," + bottomCol);
113                  // System.out.println(topRow + "," + topCol + "," + bottomRow + "," + bottomCol);
114                  int tempRow = topRow;
115                  while (tempRow <= bottomRow) {
116                      int tempCol = topCol;
117                      while (tempCol <= bottomCol) {
118                          map1.put(tempRow + "," + tempCol, "");
119                          tempCol++;
120                      }
121                      tempRow++;
122                  }
123                  map1.remove(topRow + "," + topCol);
124              }
125              Map[] map = { map0, map1 };
126              return map;
127          }
128
129
130          /**
131           * 获取表格单元格Cell内容
132           * @param cell
133           * @return
134           */
135          private static String getCellValue(Cell cell) {
136
137              String result = new String();
138              switch (cell.getCellType()) {
139              case Cell.CELL_TYPE_NUMERIC:// 数字类型
140                  if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
141                      SimpleDateFormat sdf = null;
142                      if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
143                          sdf = new SimpleDateFormat("HH:mm");
144                      } else {// 日期
145                          sdf = new SimpleDateFormat("yyyy-MM-dd");
146                      }
147                      Date date = cell.getDateCellValue();
148                      result = sdf.format(date);
149                  } else if (cell.getCellStyle().getDataFormat() == 58) {
150                      // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
151                      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
152                      double value = cell.getNumericCellValue();
153                      Date date = org.apache.poi.ss.usermodel.DateUtil
154                              .getJavaDate(value);
155                      result = sdf.format(date);
156                  } else {
157                      double value = cell.getNumericCellValue();
158                      CellStyle style = cell.getCellStyle();
159                      DecimalFormat format = new DecimalFormat();
160                      String temp = style.getDataFormatString();
161                      // 单元格设置成常规
162                      if (temp.equals("General")) {
163                          format.applyPattern("#");
164                      }
165                      result = format.format(value);
166                  }
167                  break;
168              case Cell.CELL_TYPE_STRING:// String类型
169                  result = cell.getRichStringCellValue().toString();
170                  break;
171              case Cell.CELL_TYPE_BLANK:
172                  result = "";
173                  break;
174              default:
175                  result = "";
176                  break;
177              }
178              return result;
179          }
180
181          /**
182           * 处理表格样式
183           * @param wb
184           * @param sheet
185           * @param sb
186           */
187          private static void dealExcelStyle(Workbook wb,Sheet sheet,Cell cell,StringBuffer sb){
188
189              CellStyle cellStyle = cell.getCellStyle();
190              if (cellStyle != null) {
191                  short alignment = cellStyle.getAlignment();
192              //    sb.append("align=‘" + convertAlignToHtml(alignment) + "‘ ");//单元格内容的水平对齐方式
193                  short verticalAlignment = cellStyle.getVerticalAlignment();
194                  sb.append("valign=‘"+ convertVerticalAlignToHtml(verticalAlignment)+ "‘ ");//单元格中内容的垂直排列方式
195
196                  if (wb instanceof XSSFWorkbook) {
197
198                      XSSFFont xf = ((XSSFCellStyle) cellStyle).getFont();
199                      short boldWeight = xf.getBoldweight();
200                      String  align = convertAlignToHtml(alignment);
201                      sb.append("style=‘");
202                      sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
203                      sb.append("font-size: " + xf.getFontHeight() / 2 + "%;"); // 字体大小
204                      int columnWidth = sheet.getColumnWidth(cell.getColumnIndex()) ;
205                      sb.append("width:" + columnWidth + "px;");
206                      sb.append("text-align:" + align + ";");//表头排版样式
207                      XSSFColor xc = xf.getXSSFColor();
208                      if (xc != null && !"".equals(xc)) {
209                          sb.append("color:#" + xc.getARGBHex().substring(2) + ";"); // 字体颜色
210                      }
211
212                      XSSFColor bgColor = (XSSFColor) cellStyle.getFillForegroundColorColor();
213                      if (bgColor != null && !"".equals(bgColor)) {
214                          sb.append("background-color:#" + bgColor.getARGBHex().substring(2) + ";"); // 背景颜色
215                      }
216                      sb.append(getBorderStyle(0,cellStyle.getBorderTop(), ((XSSFCellStyle) cellStyle).getTopBorderXSSFColor()));
217                      sb.append(getBorderStyle(1,cellStyle.getBorderRight(), ((XSSFCellStyle) cellStyle).getRightBorderXSSFColor()));
218                      sb.append(getBorderStyle(2,cellStyle.getBorderBottom(), ((XSSFCellStyle) cellStyle).getBottomBorderXSSFColor()));
219                      sb.append(getBorderStyle(3,cellStyle.getBorderLeft(), ((XSSFCellStyle) cellStyle).getLeftBorderXSSFColor()));
220
221                  }else if(wb instanceof HSSFWorkbook){
222
223                      HSSFFont hf = ((HSSFCellStyle) cellStyle).getFont(wb);
224                      short boldWeight = hf.getBoldweight();
225                      short fontColor = hf.getColor();
226                      sb.append("style=‘");
227                      HSSFPalette palette = ((HSSFWorkbook) wb).getCustomPalette(); // 类HSSFPalette用于求的颜色的国际标准形式
228                      HSSFColor hc = palette.getColor(fontColor);
229                      sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
230                      sb.append("font-size: " + hf.getFontHeight() / 2 + "%;"); // 字体大小
231                      String  align = convertAlignToHtml(alignment);
232                      sb.append("text-align:" + align + ";");//表头排版样式
233                      String fontColorStr = convertToStardColor(hc);
234                      if (fontColorStr != null && !"".equals(fontColorStr.trim())) {
235                          sb.append("color:" + fontColorStr + ";"); // 字体颜色
236                      }
237                      int columnWidth = sheet.getColumnWidth(cell.getColumnIndex()) ;
238                      sb.append("width:" + columnWidth + "px;");
239                      short bgColor = cellStyle.getFillForegroundColor();
240                      hc = palette.getColor(bgColor);
241                      String bgColorStr = convertToStardColor(hc);
242                      if (bgColorStr != null && !"".equals(bgColorStr.trim())) {
243                          sb.append("background-color:" + bgColorStr + ";"); // 背景颜色
244                      }
245                      sb.append( getBorderStyle(palette,0,cellStyle.getBorderTop(),cellStyle.getTopBorderColor()));
246                      sb.append( getBorderStyle(palette,1,cellStyle.getBorderRight(),cellStyle.getRightBorderColor()));
247                      sb.append( getBorderStyle(palette,3,cellStyle.getBorderLeft(),cellStyle.getLeftBorderColor()));
248                      sb.append( getBorderStyle(palette,2,cellStyle.getBorderBottom(),cellStyle.getBottomBorderColor()));
249                  }
250
251                  sb.append("‘ ");
252              }
253          }
254
255          /**
256           * 单元格内容的水平对齐方式
257           * @param alignment
258           * @return
259           */
260          private static String convertAlignToHtml(short alignment) {
261
262              String align = "center";
263              switch (alignment) {
264              case CellStyle.ALIGN_LEFT:
265                  align = "left";
266                  break;
267              case CellStyle.ALIGN_CENTER:
268                  align = "center";
269                  break;
270              case CellStyle.ALIGN_RIGHT:
271                  align = "right";
272                  break;
273              default:
274                  break;
275              }
276              return align;
277          }
278
279          /**
280           * 单元格中内容的垂直排列方式
281           * @param verticalAlignment
282           * @return
283           */
284          private static String convertVerticalAlignToHtml(short verticalAlignment) {
285
286              String valign = "middle";
287              switch (verticalAlignment) {
288              case CellStyle.VERTICAL_BOTTOM:
289                  valign = "bottom";
290                  break;
291              case CellStyle.VERTICAL_CENTER:
292                  valign = "center";
293                  break;
294              case CellStyle.VERTICAL_TOP:
295                  valign = "top";
296                  break;
297              default:
298                  break;
299              }
300              return valign;
301          }
302
303          private static String convertToStardColor(HSSFColor hc) {
304
305              StringBuffer sb = new StringBuffer("");
306              if (hc != null) {
307                  if (HSSFColor.AUTOMATIC.index == hc.getIndex()) {
308                      return null;
309                  }
310                  sb.append("#");
311                  for (int i = 0; i < hc.getTriplet().length; i++) {
312                      sb.append(fillWithZero(Integer.toHexString(hc.getTriplet()[i])));
313                  }
314              }
315
316              return sb.toString();
317          }
318
319          private static String fillWithZero(String str) {
320              if (str != null && str.length() < 2) {
321                  return "0" + str;
322              }
323              return str;
324          }
325
326          static String[] bordesr={"border-top:","border-right:","border-bottom:","border-left:"};
327          static String[] borderStyles={"solid ","solid ","solid ","solid ","solid ","solid ","solid ","solid ","solid ","solid","solid","solid","solid","solid"};
328
329          private static  String getBorderStyle(  HSSFPalette palette ,int b,short s, short t){
330
331              if(s==0)return  bordesr[b]+borderStyles[s]+"#d0d7e5 1px;";;
332              String borderColorStr = convertToStardColor( palette.getColor(t));
333              borderColorStr=borderColorStr==null|| borderColorStr.length()<1?"#000000":borderColorStr;
334              return bordesr[b]+borderStyles[s]+borderColorStr+" 1px;";
335
336          }
337
338          private static  String getBorderStyle(int b,short s, XSSFColor xc){
339
340               if(s==0)return  bordesr[b]+borderStyles[s]+"#d0d7e5 1px;";;
341               if (xc != null && !"".equals(xc)) {
342                   String borderColorStr = xc.getARGBHex();//t.getARGBHex();
343                   borderColorStr=borderColorStr==null|| borderColorStr.length()<1?"#000000":borderColorStr.substring(2);
344                   return bordesr[b]+borderStyles[s]+borderColorStr+" 1px;";
345               }
346
347               return "";
348          }
349          /*
350           * @param content 生成的excel表格标签
351           * @param htmlPath 生成的html文件地址
352          */
353          private static void writeFile(String content,String htmlPath){
354              File file2 = new File(htmlPath);
355               StringBuilder sb = new StringBuilder();
356               try {
357                file2.createNewFile();//创建文件
358
359                sb.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\"><title>Html Test</title></head><body>");
360                sb.append("<div>");
361                sb.append(content);
362                sb.append("</div>");
363                sb.append("</body></html>");
364
365                PrintStream printStream = new PrintStream(new FileOutputStream(file2));
366
367                printStream.println(sb.toString());//将字符串写入文件
368
369               } catch (IOException e) {
370
371                e.printStackTrace();
372               }
373
374          }
375
376 

大家如果有什么不懂的,希望大家提出来,一起交流,一起进步。

时间: 2024-10-14 20:36:20

excel转html 实现在线预览的相关文章

Atitit.office&#160;word&#160;&#160;excel&#160;&#160;ppt&#160;pdf&#160;的web在线预览方案与html转换方案&#160;attilax&#160;总结

Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求1 1.1. 显示效果要好1 1.2. 可以自定义显示界面1 1.3. 不需要控件,兼容性好1 1.4. 支持编辑操作1 2. 纯html预览解决之道(自由的格式)1 3. 转换swf flash方案2 4. 转换pdf方式..更多的浏览器已经直接支持pdf格式查看2 5. 控件方式2 6. Hyb

[Asp.net]常见word,excel,ppt,pdf在线预览方案(转)

引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点:Office文档链接在浏览器中打开,会有如上图的提示,需用户自己选择打开或者保存功能,如果客户电脑上安装迅雷下载软件,会启动迅雷下载,用户体验不好. 方案二 office文档转html,首先引入com组件中office库,然后在程序集扩展中引入word,excel,ppt的dll. 然后F6生成,会

[Asp.net]常见word,excel,ppt,pdf在线预览方案

在线预览PDF格式 文章地址:http://www.cnblogs.com/wolf-sun/p/3525437.html [Asp.net]常见word,excel,ppt,pdf在线预览方案 http://www.cnblogs.com/wolf-sun/p/3569960.html http://www.cnblogs.com/wolf-sun/p/3574278.html [Asp.net]常见word,excel,ppt,pdf在线预览方案

jsp有办法实现word/excel的在线预览吗?谁帮忙解决下呀

原文:jsp有办法实现word/excel的在线预览吗?谁帮忙解决下呀 代码下载地址:http://www.zuidaima.com/share/1550463230954496.htm 类似于QQ邮箱,gmail邮箱预览的那种效果. jsp有办法实现word/excel的在线预览吗?谁帮忙解决下呀

ASP.NET MVC在线预览Excel、Word、TXT、PDF文件

代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Microsoft.Office.Interop.Excel; using System.Diagnostics; using System.IO; using Microsoft.Office.Interop.Word; namespace Suya.Web.Ap

Aspose office (Excel,Word,PPT),PDF 在线预览

就是做个备份,拿的是试用版的 Aspose         /// <summary>         /// Aspose office (Excel,Word,PPT),PDF 在线预览         /// </summary>         /// <param name="sourceDoc">需要预览的文件地址</param>         /// <param name="saveDoc"&g

怎么实现word,excel在线预览

在开发工作当中肯定会遇到需要在线预览word ,excel的功能,咋也不能抓瞎呀,有问题就解决问题. 目前有两种模式1.付费的编辑器购买2.把文档放到第三方网站上去然后实现: 前者价格比较高:后者简单,但是隐私性不够好,正可谓公司机密公司机密,定不能随便把文档交给第三方网站的 现在我在nuget上写了一个库ce.office.extension,可实现word,excel的在线预览功能,可供使用. 有需要的可自取哦,挥手不谢- 原文地址:https://blog.51cto.com/147813

关于在线预览word,excel,ppt,pdf的需求处理方法。

参考文档:http://www.cnblogs.com/wolf-sun/p/3574278.html 我选用的方案:先用office com组件生成pdf,然后使用pdf.js在线预览pdf文档.在自己写demo的过程下遇到如下两个问题,在此记录一下,希望能帮助到遇到同类问题的兄弟姐妹们.   1.在服务器上安装Office Plus 2010后,使用其com组件生成pdf时出现权限错误 System.UnauthorizedAccessException: Retrieving the CO

在线预览word,excel,ppt

https://view.officeapps.live.com/op/view.aspx?src=服务器地址 微软提供的地址拼接自己的可以预览了 拼接自己的服务器地址可以在线预览 原文地址:https://www.cnblogs.com/holy-amy/p/11251604.html