导出 excel 有时也挺头痛的
poi,jxl 未免太过复杂
js 方式有浏览器兼容问题,而且不能把页面的样式一般导出
其实有一种简单的方式可以导出格式良好的 excel
我之前就用这种方式做简单格式的 excel 导出的
今天有个技术群里有人问导出 excel 方法
于是做了个例子
第一步:打开 excel,设置一个 excel 模板, 然后另存为 XML 表格
第二步:用文本编辑器打开刚刚保存的模板文件,把代码复制粘贴到JSP页面,如 export.jsp
第三步:如展示页面一样写后台 Action, Action 跳转到对应的JSP页面(export.jsp)
JSP 页面代码如下
这样就如同JSP展示页面一样做导出了
把下面的代码也放到 action 中
这样就可以多个导出需求(多少 action/方法)都对应一个JSP页面
每个需求设置不同的文件名,传不同的标题数组以及结果集就可以了
注意一点:定义模板时的行一定好大于实际导出的行,要不导出的文件无法打开
poi,jxl 未免太过复杂
js 方式有浏览器兼容问题,而且不能把页面的样式一般导出
其实有一种简单的方式可以导出格式良好的 excel
我之前就用这种方式做简单格式的 excel 导出的
今天有个技术群里有人问导出 excel 方法
于是做了个例子
第一步:打开 excel,设置一个 excel 模板, 然后另存为 XML 表格
第二步:用文本编辑器打开刚刚保存的模板文件,把代码复制粘贴到JSP页面,如 export.jsp
第三步:如展示页面一样写后台 Action, Action 跳转到对应的JSP页面(export.jsp)
JSP 页面代码如下
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page contentType="application/vnd.ms-excel; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%response.addHeader("Content-Disposition: attachment", "filename=test.xls");%>
<!-- 以下为 excel 里定制的模板代码,打开 excel 设置格式,然后另存为 XML 表格 -->
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="<A href="http://www.w3.org/TR/REC-html40">http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Ivan Self</Author>
<LastAuthor>Ivan Self</LastAuthor>
<Created>2010-07-21T11:40:53Z</Created>
<LastSaved>2010-07-21T12:01:49Z</LastSaved>
<Version>11.5606</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>8895</WindowHeight>
<WindowWidth>11715</WindowWidth>
<WindowTopX>240</WindowTopX>
<WindowTopY>15</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s21">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="14" ss:Bold="1"/>
<Interior ss:Color="#00CCFF" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s22">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="3013" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Row ss:Height="18.75">
<!-- 标题 相当于后台传来的标题数组 -->
<c:forEach begin="1" end="3" var="h">
<Cell ss:StyleID="s21"><Data ss:Type="String">标题_${h}</Data></Cell>
</c:forEach>
</Row>
<!-- 结果集 相当于后台传来的结果集 -->
<c:forEach begin="1" end="3" var="rs">
<Row>
<Cell ss:StyleID="s22"><Data ss:Type="String">a_${rs}</Data></Cell>
<Cell ss:StyleID="s22"><Data ss:Type="String">b_${rs}</Data></Cell>
<Cell ss:StyleID="s22"><Data ss:Type="String">c_${rs}</Data></Cell>
</Row>
</c:forEach>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>2984</ActiveRow>
<ActiveCol>3</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
这样就如同JSP展示页面一样做导出了
把下面的代码也放到 action 中
<%response.addHeader("Content-Disposition: attachment", "filename=test.xls");%>
这样就可以多个导出需求(多少 action/方法)都对应一个JSP页面
每个需求设置不同的文件名,传不同的标题数组以及结果集就可以了
注意一点:定义模板时的行一定好大于实际导出的行,要不导出的文件无法打开