如何在ASP.NET中生成Excel文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (131)

我正要为ASP.NET应用程序(VB.NET代码隐藏)添加一个部分,以允许用户将数据返回给他们作为Excel文件,我将根据数据库数据生成该文件。虽然有几种方法可以做到这一点,但每种方法都有其缺陷。将如何返回的数据?我正在寻找尽可能干净和直接的东西。

提问于
用户回答回答于

CSV

优点:

  • 简单

缺点:

  • 它可能不适用于其他语言环境或不同的Excel配置(即列表分隔符)
  • 无法应用格式设置,公式等

HTML

优点:

  • 还很简单
  • 支持简单的格式和公式

缺点:

  • 必须将文件命名为xls,Excel可能会警告打开非本机Excel文件
  • 每个工作簿一个工作表

OpenXML(Office 2007 .XLSX)

优点:

  • 本机Excel格式
  • 支持所有Excel功能
  • 要求安装Excel的副本
  • 可以生成数据透视表
  • 可以使用开源项目EPPlus生成

缺点:

  • Excel 2007之外的兼容性有限(现在不应该是个问题)
  • 除非使用第三方组件,否则会变得复杂

SpreadSheetML(开放格式XML)

优点:

  • 与原生Excel格式相比较简单
  • 支持大多数Excel功能:格式化,样式,公式,每个工作簿多个工作表
  • 不需要安装Excel即可使用它
  • 没有第三方库需要 - 只需写出你的XML
  • 文档可以通过Excel XP / 2003/2007打开

缺点:

  • 缺乏良好的文档
  • 旧版本的Excel不支持(2000之前)
  • 只写,因为一旦您打开它并从Excel中进行更改,它就会转换为本机Excel。

XLS(由第三方组件生成)

优点:

  • 用所有格式,公式等生成本地Excel文件

缺点:

  • 成本钱
  • 添加依赖关系

通过Interop

优点:

  • 使用本机Microsoft库
  • 阅读对原生文档的支持

缺点:

  • 非常慢
  • 依赖/版本匹配问题
  • 并发/数据完整性问题,供网站在阅读时使用
  • 非常慢
  • 扩展Web使用问题(与并发不同):需要在服务器上创建大量Excel应用程序实例
  • 需要Windows
  • 我提到它很慢吗?
用户回答回答于

可以将数据输出为html表格单元格,在其上粘贴一个.xls或一个.xlsx扩展名,并且Excel将打开它,就好像它是一个本地文档。你甚至可以用这种方式进行一些有限的格式和公式计算,所以它比CSV更强大。另外,输出一个html表格应该很容易从ASP.Net这样的web平台上完成;)

如果需要Excel工作簿中的多个工作表或命名工作表,则可以通过名为的XML模式执行类似的操作SpreadSheetML。这不是 Office 2007附带的新格式,而是与Excel 2000完全不同的东西。解释其工作原理的最简单方法是以下示例:

<?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="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
      <Author>Your_name_here</Author>
      <LastAuthor>Your_name_here</LastAuthor>
      <Created>20080625</Created>
      <Company>ABC Inc</Company>
      <Version>10.2625</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        <WindowHeight>6135</WindowHeight>
        <WindowWidth>8445</WindowWidth>
        <WindowTopX>240</WindowTopX>
        <WindowTopY>120</WindowTopY>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>

<Styles>
      <Style ss:ID="Default" ss:Name="Normal">
            <Alignment ss:Vertical="Bottom" />
            <Borders />
            <Font />
            <Interior />
            <NumberFormat />
            <Protection />
      </Style>
</Styles>

<Worksheet ss:Name="Sample Sheet 1">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table1">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="Number">1</Data></Cell>
      <Cell><Data ss:Type="Number">2</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">3</Data></Cell>
      <Cell><Data ss:Type="Number">4</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">5</Data></Cell>
      <Cell><Data ss:Type="Number">6</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">7</Data></Cell>
      <Cell><Data ss:Type="Number">8</Data></Cell>
</Row>
</Table>
</Worksheet>

<Worksheet ss:Name="Sample Sheet 2">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table2">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="String">A</Data></Cell>
      <Cell><Data ss:Type="String">B</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">C</Data></Cell>
      <Cell><Data ss:Type="String">D</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">E</Data></Cell>
      <Cell><Data ss:Type="String">F</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">G</Data></Cell>
      <Cell><Data ss:Type="String">H</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook> 

扫码关注云+社区

领取腾讯云代金券