把HTML无嵌套的表格完美导出为Excel文件的方法
|
zhaoxq
老紫竹 ![]()
管理员
|
1 # 大 中 小 发表于 2008-03-18 06:57:25
此方法生成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>
快乐渡过每一天,减肥坚持每一天
|
|||||
|
|
jincheng19
jincheng19
普通会员
|
2 # 大 中 小 发表于 2008-07-22 15:24:18
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视频教学全 |
|||||
|




