把HTML无嵌套表格完美导出为Excel文件的方法

来源:互联网 发布:linux虚拟存储器系统 编辑:程序博客网 时间:2024/06/14 04:02

原文地址:http://blog.csdn.net/java2000_net/article/details/2684994

此方法生成xls文件,不是那种简单的通过文件头来实现的那种。而是真正的Excel文件。

此方法支持那种合并的单元格,需要jxl类库的支持。

jxl 的下载地址 http://sourceforge.net/project/showfiles.php?group_id=79926 

如果打不开了,我想CSDN的下载频道一定有。或者到我的网站【下载资源】里面下载。

 

如果代码看不清楚,或者有问题,请到原始地址,或者到底部看截图

 



1 我们先看页面的部分

 

[HTML] view plaincopy
  1. <script type="text/javascript">  
  2. function exportExcel(id){  
  3.   var forum = document.forms["ExcelExportor"];  
  4.   forum.c.value=eval(id+".innerHTML");  
  5.   forum.submit();  
  6. }  
  7. </script>  
  8. <form name="ExcelExportor" action="/export/excel.jsp" method="OST">  
  9.   <input name="c" type="hidden">  
  10.   <input class="mybutton" onclick="exportExcel(&apos;MAIN_TABLE&apos;)" value="导出Excel" type="button">  
  11. </form>  
  12. <!-- 下面是你要导出的表格,其id必须和前面的相同 -->  
  13. ...  
  14. <table id="MAIN_TABLE" border="0" cellpadding="2" cellspacing="1"><tbody><tr class="title"><td>行号</td><td>客户编号</td><td>合同类型</td><td>客户名称</td><td>事业部</td><td>签订日期</td><td>有效期起始</td><td>有效期终止</td><td>信用额度</td><td>收货人</td><td>收货人身份证</td><td>收货省</td><td>收货城市</td><td>收货地址</td><td>备注</td></tr></tbody></table>  

唯一需要修改的,就是你的要导出的Table的ID 必须和Form里面的ID相同,比如都叫 "MAIN_TABLE"; 
当然,你换成任何其它名字都是可以的。 

2 下面我们来看那个被影射成的/export/excel.jsp 的 servlet

[Java] view plaincopy
  1. import java.io.IOException;  
  2. import java.io.OutputStream;  
  3. import java.io.UnsupportedEncodingException;  
  4. import java.io.Writer;  
  5. import java.util.ArrayList;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. import jxl.Workbook;  
  15. import jxl.write.Label;  
  16. import jxl.write.WritableSheet;  
  17. import jxl.write.WritableWorkbook;  
  18. import jxl.write.WriteException;  
  19. import jxl.write.biff.RowsExceededException;  
  20.   
  21. /** 
  22. * 解析页面并导出为Excel格式。 
  23.  
  24. * @author JAVA世纪网,www.java2000.net,赵学庆 
  25.  
  26. */  
  27. public class ExcelExportor extends HttpServlet {  
  28.   
  29.   private static final long serialVersionUID = 8563623076707865788L;  
  30.   
  31.   @Override  
  32.   public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  33.     request.setCharacterEncoding("GBK");  
  34.     String content = request.getParameter("c");  
  35.     if (content == null) {  
  36.       Writer out = response.getWriter();  
  37.       response.setCharacterEncoding("GBK");  
  38.       out.write("No Content");  
  39.       return;  
  40.     }  
  41.     try {  
  42.       export(content, response);  
  43.     } catch (Exception ex) {  
  44.       ex.printStackTrace();  
  45.     }  
  46.   }  
  47.   
  48.   private WritableWorkbook wwb = null;  
  49.   
  50.   private WritableSheet sheet = null;  
  51.   
  52.   private void export(String content, HttpServletResponse response) throws IOException, RowsExceededException, WriteException {  
  53.     response.setContentType("application/ms-excel");  
  54.     String sheetName = getCaption(content);  
  55.     if (sheetName == null) {  
  56.       sheetName = "Sheet1";  
  57.     }  
  58.     sheetName = sheetName.replaceAll(":""").replaceAll("[)]""").replaceAll("[(]""");  
  59.     response.addHeader("Content-Disposition""attachment; filename=" + new String(sheetName.getBytes("GBK"), "ISO-8859-1")  
  60.         + ".xls");  
  61.   
  62.     OutputStream os = response.getOutputStream();  
  63.     wwb = Workbook.createWorkbook(os);  
  64.     wwb.setProtected(true);  
  65.   
  66.     sheet = wwb.createSheet(sheetName, 0);  
  67.     int row = 0;  
  68.     int col = 0;  
  69.     Label label = null;  
  70.   
  71.     if (sheetName.trim().length() > 30) {  
  72.       label = new Label(col, row, sheetName);  
  73.       sheet.addCell(label);  
  74.       row++;  
  75.     }  
  76.   
  77.     List listBody = getContent(content);  
  78.     Map<string, boolean=""> map = new HashMap<string, boolean="">();  
  79.     for (TD td : listBody) {  
  80.       if (td == null) {  
  81.         row++;  
  82.         col = 0;  
  83.         continue;  
  84.       }  
  85.   
  86.       while (map.get(col + "-" + row) != null) {          
  87.         col++;  
  88.       }  
  89.   
  90.       if (td.colspan > 1 || td.rowspan > 1) {  
  91.         sheet.mergeCells(col, row, col + td.colspan - 1, row + td.rowspan - 1);  
  92.         for (int i = col; i <= col + td.colspan - 1; i++) {  
  93.           for (int j = row; j <= row + td.rowspan - 1; j++) {  
  94.             map.put(i + "-" + j, true);  
  95.           }  
  96.         }  
  97.       }  
  98.   
  99.       label = new Label(col, row, td.content);  
  100.       sheet.addCell(label);  
  101.   
  102.       map.put(col + "-" + row, true);  
  103.       col += td.colspan;  
  104.     }  
  105.     wwb.write();  
  106.     wwb.close();  
  107.   }  
  108.   
  109.   private String getCaption(String content) {  
  110.     int begin = content.indexOf("<caption"); end="'&apos;&apos;content.indexOf("</CAPTION&apos;&apos;'" int="">");  
  111.     if (begin == -1 || end == -1) {  
  112.       return null;  
  113.     }  
  114.     begin = content.indexOf(">", begin);  
  115.     if (begin == -1) {  
  116.       return null;  
  117.     }  
  118.     return content.substring(begin + 1, end);  
  119.   }  
  120.   
  121.   public List getContent(String content) throws UnsupportedEncodingException {  
  122.     int begin = -1;  
  123.     int end = -1;  
  124.     int index = -1;  
  125.     String numberStr;  
  126.     int number;  
  127.     String[] tables = content.split("");  
  128.     List list = new ArrayList();  
  129.     for (String table : tables) {  
  130.       String[] trs = table.split("");  
  131.       for (String tr : trs) {  
  132.   
  133.         number = 1;  
  134.         String[] ss = tr.split("");  
  135.         for (String s : ss) {  
  136.           begin = s.indexOf("<td"); index="'&apos;&apos;s.indexOf("&apos;&apos;'" 3);="" +="" s="s.substring(begin" }="" continue;="" {="" -1)="" (begin="=" if="">");  
  137.           TD td = new TD();  
  138.           begin = s.indexOf("rowSpan=");  
  139.           if (begin != -1) {  
  140.             end = s.indexOf(" ", begin);  
  141.   
  142.             if (end == -1) {  
  143.               end = index;  
  144.             }  
  145.             numberStr = s.substring(begin + 8, end).replace(&apos;"&apos;, &apos; &apos;).replace(&apos;/&apos;&apos;, &apos; &apos;).trim();  
  146.             number = Integer.parseInt(numberStr);  
  147.             td.rowspan = number;  
  148.           }  
  149.   
  150.           begin = s.indexOf("colSpan=");  
  151.           if (begin != -1) {  
  152.             end = s.indexOf(" ", begin);  
  153.             index = s.indexOf(">", begin);  
  154.             if (end == -1) {  
  155.               end = index;  
  156.             }  
  157.             if (end > index) {  
  158.               end = index;  
  159.             }  
  160.             numberStr = s.substring(begin + 8, end).replace(&apos;"&apos;, &apos; &apos;).replace(&apos;/&apos;&apos;, &apos; &apos;).trim();  
  161.             number = Integer.parseInt(numberStr);  
  162.             td.colspan = number;  
  163.           }  
  164.           td.content = s.substring(index + 1).replaceAll("//<.*?//>""").replaceAll(" """).trim();  
  165.           list.add(td);  
  166.         }  
  167.         list.add(null);  
  168.       }  
  169.       list.add(null);  
  170.       list.add(null);  
  171.     }  
  172.     return list;  
  173.   }  
  174. }  
  175.   
  176. class TD {  
  177.   int rowspan = 1;  
  178.   
  179.   int colspan = 1;  
  180.   
  181.   String content;  
  182. }</td");></caption");></string,></string,>  

详细的我就不多解释了,基本就是解析Table的语法,唯一需要注意的,里面的CharacterEncoding() 需要你根据自己的情况进行修改。 

3 最后那个web.xml的影射我就顺便给了,其实大家都知道怎么做


 

[XML] view plaincopy
  1. <servlet>  
  2.  <servlet-name>ExcelExportor</servlet-name>  
  3.  <servlet-class>ExcelExportor</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.  <servlet-name>ExcelExportor</servlet-name>  
  7.  <url-pattern>/export/excel.jsp</url-pattern>  
  8. /servlet-mapping>  

========================================================================
============================以下是截图,不是文字 ========================
========================================================================


0 0
原创粉丝点击