`
風一樣的男子
  • 浏览: 60984 次
  • 性别: Icon_minigender_1
  • 来自: 粤东北山卡拉
社区版块
存档分类
最新评论

一种导出 excel 的简单方法

    博客分类:
  • Java
阅读更多
导出 excel 有时也挺头痛的
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页面
每个需求设置不同的文件名,传不同的标题数组以及结果集就可以了

注意一点:定义模板时的行一定好大于实际导出的行,要不导出的文件无法打开

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics