把HTML无嵌套表格完美导出为Excel文件的方法
2014-01-16 11:32
295 查看
原文地址: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
<script type="text/javascript">
function exportExcel(id){
var forum = document.forms["ExcelExportor"];
forum.c.value=eval(id+".innerHTML");
forum.submit();
}
</script>
<form name="ExcelExportor" action="/export/excel.jsp" method="OST">
<input name="c" type="hidden">
<input class="mybutton" onclick="exportExcel('MAIN_TABLE')" value="导出Excel" type="button">
</form>
<!-- 下面是你要导出的表格,其id必须和前面的相同 -->
...
<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
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("No Content");
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 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"); end="'''content.indexOf("</CAPTION'''" int="">");
if (begin == -1 || end == -1) {
return null;
}
begin = content.indexOf(">", begin);
if (begin == -1) {
return null;
}
return content.substring(begin + 1, end);
}
public List getContent(String content) throws UnsupportedEncodingException {
int begin = -1;
int end = -1;
int index = -1;
String numberStr;
int number;
String[] tables = content.split("");
List list = new ArrayList();
for (String table : tables) {
String[] trs = table.split("");
for (String tr : trs) {
number = 1;
String[] ss = tr.split("");
for (String s : ss) {
begin = s.indexOf("<td"); index="'''s.indexOf("'''" 3);="" +="" s="s.substring(begin" }="" continue;="" {="" -1)="" (begin="=" if="">");
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;
}</td");></caption");></string,></string,>
详细的我就不多解释了,基本就是解析Table的语法,唯一需要注意的,里面的CharacterEncoding() 需要你根据自己的情况进行修改。
3 最后那个web.xml的影射我就顺便给了,其实大家都知道怎么做
[XML] view
plaincopy
<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>
========================================================================
============================以下是截图,不是文字 ========================
========================================================================
此方法生成xls文件,不是那种简单的通过文件头来实现的那种。而是真正的Excel文件。
此方法支持那种合并的单元格,需要jxl类库的支持。
jxl 的下载地址 http://sourceforge.net/project/showfiles.php?group_id=79926
如果打不开了,我想CSDN的下载频道一定有。或者到我的网站【下载资源】里面下载。
如果代码看不清楚,或者有问题,请到原始地址,或者到底部看截图
1 我们先看页面的部分
[HTML] view
plaincopy
<script type="text/javascript">
function exportExcel(id){
var forum = document.forms["ExcelExportor"];
forum.c.value=eval(id+".innerHTML");
forum.submit();
}
</script>
<form name="ExcelExportor" action="/export/excel.jsp" method="OST">
<input name="c" type="hidden">
<input class="mybutton" onclick="exportExcel('MAIN_TABLE')" value="导出Excel" type="button">
</form>
<!-- 下面是你要导出的表格,其id必须和前面的相同 -->
...
<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
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("No Content");
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 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"); end="'''content.indexOf("</CAPTION'''" int="">");
if (begin == -1 || end == -1) {
return null;
}
begin = content.indexOf(">", begin);
if (begin == -1) {
return null;
}
return content.substring(begin + 1, end);
}
public List getContent(String content) throws UnsupportedEncodingException {
int begin = -1;
int end = -1;
int index = -1;
String numberStr;
int number;
String[] tables = content.split("");
List list = new ArrayList();
for (String table : tables) {
String[] trs = table.split("");
for (String tr : trs) {
number = 1;
String[] ss = tr.split("");
for (String s : ss) {
begin = s.indexOf("<td"); index="'''s.indexOf("'''" 3);="" +="" s="s.substring(begin" }="" continue;="" {="" -1)="" (begin="=" if="">");
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;
}</td");></caption");></string,></string,>
详细的我就不多解释了,基本就是解析Table的语法,唯一需要注意的,里面的CharacterEncoding() 需要你根据自己的情况进行修改。
3 最后那个web.xml的影射我就顺便给了,其实大家都知道怎么做
[XML] view
plaincopy
<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>
========================================================================
============================以下是截图,不是文字 ========================
========================================================================
相关文章推荐
- [转贴]把HTML无嵌套表格完美导出为Excel文件的方法
- 把HTML无嵌套表格完美导出为Excel文件的方法
- C#导出生成excel文件方法(xml,html方式)
- C#导出生成excel文件的方法小结(xml,html方式)
- datagrid数据导出到excel文件给客户端下载的几种方法 (xls,csv,html)
- html 中设置span的width完美解决方法
- Java 实现HTML富文本导出至word完美解决方案
- 导出Excel的方法,传入为table或html!
- 利用js将html表格导出为excel文件
- HTML用JS导出Excel的五种方法
- 导出的最简单方法(text/html/word)
- mysql导出excel文件的几种方法
- 后台运用html格式导出Excel文件
- Axure8导出html方式及对应css样式修改方法
- DataGridView扩展方法行号、全选、导出到Excel(引用excel组件、生成html两种方式)
- html导出Excel方法
- 用ASP将数据读数导出EXCEL文件的四种方法
- php原生导出excel文件的两种方法(推荐)
- HTML用JS导出Excel的五种方法
- HTML用JS导出Excel的五种方法