发新话题

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

此方法生成xls文件,不是那种简单的通过文件头来实现的那种。
此方法支持那种合并的单元格,需要jxl类库的支持。
jxl 的下载地址 http://sourceforge.net/project/showfiles.php?group_id=79926

1 我们先看页面的部分
<script type="text/javascript">
function exportExcel(id){
  var forum = document.forms["ExcelExportor"];
  forum.c.value=eval(id+".innerHTML");
  forum.submit();
}
</script>
<form name="ExcelExportor" method="OST" action="/export/excel.jsp">
  <input type="hidden" name="c" />
  <input onclick="exportExcel('MAIN_TABLE')" type="button" class="mybutton" value="导出Excel">
</form>
<!-- 下面是你要导出的表格,其id必须和前面的相同 -->
<table border=0 cellpadding="2" cellspacing="1" id="MAIN_TABLE">
  <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>
...
</table>
唯一需要修改的,就是你的要导出的Table的ID 必须和Form里面的ID相同,比如都叫 "MAIN_TABLE";
当然,你换成任何其它名字都是可以的。

2 下面我们来看那个被影射成的/export/excel.jsp 的 servlet
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

/**
* 解析页面并导出为Excel格式。
* 
* @author JAVA世纪网,www.java2000.net,赵学庆
* 
*/
public class ExcelExportor extends HttpServlet {

  private static final long serialVersionUID = 8563623076707865788L;

  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    request.setCharacterEncoding("GBK");
    String content = request.getParameter("c");
    if (content == null) {
      Writer out = response.getWriter();
      response.setCharacterEncoding("GBK");
      out.write("<html><body>No Content</body></html>");
      return;
    }
    try {
      export(content, response);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private WritableWorkbook wwb = null;

  private WritableSheet sheet = null;

  private void export(String content, HttpServletResponse response) throws IOException, RowsExceededException, WriteException {
    response.setContentType("application/ms-excel");
    String sheetName = getCaption(content);
    if (sheetName == null) {
      sheetName = "Sheet1";
    }
    sheetName = sheetName.replaceAll(":", "").replaceAll("[)]", "").replaceAll("[(]", "");
    response.addHeader("Content-Disposition", "attachment; filename=" + new String(sheetName.getBytes("GBK"), "ISO-8859-1")
        + ".xls");

    OutputStream os = response.getOutputStream();
    wwb = Workbook.createWorkbook(os);
    wwb.setProtected(true);

    sheet = wwb.createSheet(sheetName, 0);
    int row = 0;
    int col = 0;
    Label label = null;

    if (sheetName.trim().length() > 30) {
      label = new Label(col, row, sheetName);
      sheet.addCell(label);
      row++;
    }

    List<TD> listBody = getContent(content);
    Map<String, Boolean> map = new HashMap<String, Boolean>();
    for (TD td : listBody) {
      if (td == null) {
        row++;
        col = 0;
        continue;
      }

      while (map.get(col + "-" + row) != null) {        
        col++;
      }

      if (td.colspan > 1 || td.rowspan > 1) {
        sheet.mergeCells(col, row, col + td.colspan - 1, row + td.rowspan - 1);
        for (int i = col; i <= col + td.colspan - 1; i++) {
          for (int j = row; j <= row + td.rowspan - 1; j++) {
            map.put(i + "-" + j, true);
          }
        }
      }

      label = new Label(col, row, td.content);
      sheet.addCell(label);

      map.put(col + "-" + row, true);
      col += td.colspan;
    }
    wwb.write();
    wwb.close();
  }

  private String getCaption(String content) {
    int begin = content.indexOf("<CAPTION");
    int end = content.indexOf("</CAPTION>");
    if (begin == -1 || end == -1) {
      return null;
    }
    begin = content.indexOf(">", begin);
    if (begin == -1) {
      return null;
    }
    return content.substring(begin + 1, end);
  }

  public List<TD> getContent(String content) throws UnsupportedEncodingException {
    int begin = -1;
    int end = -1;
    int index = -1;
    String numberStr;
    int number;
    String[] tables = content.split("</TABLE>");
    List<TD> list = new ArrayList<TD>();
    for (String table : tables) {
      String[] trs = table.split("</TR>");
      for (String tr : trs) {

        number = 1;
        String[] ss = tr.split("</TD>");
        for (String s : ss) {
          begin = s.indexOf("<TD");
          if (begin == -1) {
            continue;
          }
          s = s.substring(begin + 3);
          index = s.indexOf(">");
          TD td = new TD();
          begin = s.indexOf("rowSpan=");
          if (begin != -1) {
            end = s.indexOf(" ", begin);

            if (end == -1) {
              end = index;
            }
            numberStr = s.substring(begin + 8, end).replace('"', ' ').replace('\'', ' ').trim();
            number = Integer.parseInt(numberStr);
            td.rowspan = number;
          }

          begin = s.indexOf("colSpan=");
          if (begin != -1) {
            end = s.indexOf(" ", begin);
            index = s.indexOf(">", begin);
            if (end == -1) {
              end = index;
            }
            if (end > index) {
              end = index;
            }
            numberStr = s.substring(begin + 8, end).replace('"', ' ').replace('\'', ' ').trim();
            number = Integer.parseInt(numberStr);
            td.colspan = number;
          }
          td.content = s.substring(index + 1).replaceAll("\\<.*?\\>", "").replaceAll(" ", "").trim();
          list.add(td);
        }
        list.add(null);
      }
      list.add(null);
      list.add(null);
    }
    return list;
  }
}

class TD {
  int rowspan = 1;

  int colspan = 1;

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

3 最后那个web.xml的影射我就顺便给了,其实大家都知道怎么做
 
 <servlet>
  <servlet-name>ExcelExportor</servlet-name>
  <servlet-class>ExcelExportor</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>ExcelExportor</servlet-name>
  <url-pattern>/export/excel.jsp</url-pattern>
 </servlet-mapping>
快乐渡过每一天,减肥坚持每一天



编辑 回复 快速回复 TOP
HTTPステータス 405 - HTTPのGETメソッドは、このURLではサポートされていません。


説明 The specified HTTP method is not allowed for the requested resource (HTTPのGETメソッドは、このURLではサポートされていません。).


--------------------------------------------------------------------------------

Apache Tomcat/6.0.16
J2EE视频教学全
J2EE视频教学全
编辑 回复 快速回复 TOP
发新话题