Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在网站上生成xslx文件的最佳方法是什么?可能有数百万行?_Asp.net_Excel_Streaming - Fatal编程技术网

Asp.net 在网站上生成xslx文件的最佳方法是什么?可能有数百万行?

Asp.net 在网站上生成xslx文件的最佳方法是什么?可能有数百万行?,asp.net,excel,streaming,Asp.net,Excel,Streaming,我的任务是编写一个解决方案,修复性能不佳的旧式excel文件生成器 我需要生成的文件可能会非常大。可能多达一百万行,40-50列。我想如果可能的话,我会直接向用户传输,但是我可能只需要先将文件保存到磁盘,然后为用户创建一个链接 我的目标是进行性能测试,测试我是否可以生成一个包含1.500.000行和50列的xslx文件,每个单元格包含一个随机的10个字母字符串。。。excel会处理这么大的文件吗 注意:实际上,生成的大多数文件都不会大于 300.000行,绝对最大值约为950.000行,但我喜欢

我的任务是编写一个解决方案,修复性能不佳的旧式excel文件生成器

我需要生成的文件可能会非常大。可能多达一百万行,40-50列。我想如果可能的话,我会直接向用户传输,但是我可能只需要先将文件保存到磁盘,然后为用户创建一个链接

我的目标是进行性能测试,测试我是否可以生成一个包含1.500.000行和50列的xslx文件,每个单元格包含一个随机的10个字母字符串。。。excel会处理这么大的文件吗

注意:实际上,生成的大多数文件都不会大于 300.000行,绝对最大值约为950.000行,但我喜欢 因此,在进行压力测试时要谨慎行事 150万行

关于我应该如何着手解决这项任务,你有什么建议吗。是否有我应该知道的组件?excel的局限性


PS:如果我不必在服务器上安装Excel,我将不胜感激。

虽然我无法回答Excel可以处理的最大数据量,但如果您使用新的.xlsx格式,您使用的是MS的OpenXML格式。xlsx文件实际上是一个zip压缩文件,所有文档数据都存储在内部。XML可以像任何其他XML一样编写,但您必须检查标准。有一些商业组件实现可以做到这一点。您不需要Excel来编写格式

以下是一些有用的链接:

  • -这看起来像是一个用于读/写OpenXML的开源库
  • -R/W库的另一个实现
  • -用于读/写办公室电子表格的商业.NET组件。有一个免费版本,如果你想尝试的话,它限制了你可以读写的行数
  • -用于读取和写入office文档的Java POI库的实现
  • -“一组帮助程序类,用于简化开放式Office XML文档的创建。使用开放式Office SDK v 2.0。在不使用Microsoft Word或Microsoft Excel的情况下修改或创建任何.docx或.xlsx文档。”

电子表格中的行数有一个限制()。我会生成一个文件,它实际上只是一个格式化的文本文件,可以在Excel中打开。

您可能想在中查看NPOI库以读取和写入Excel文件。至于在服务器上存储,这是一个选项,但请记住,下载文件后,您必须清理这些文件。

请查看Codeplex上的项目

这可能就是你要找的


Excel主要是电子表格软件,不能替代数据库。是否确实要将一百万行转储给最终用户?

Excel无法处理数百万行,请尝试创建一个CSV输出文件,而不是由Excel读取

不建议在用户请求时在excel中添加大量数据
他需要等待很长时间才能下载文件。

Excel2007支持最大工作表大小为1048576行乘以16384列,因此使用150万行进行测试可能不可行

编辑:Excel 2003支持更少的行:65536行乘256列

如果您能够要求您的用户能够以Excel 2007(xlsx)格式打开文档,那么这可能是您的最佳选择,因为它只是一个XML文档,可以在服务器上生成,而不需要Excel

如果您需要支持“所有”版本的excel/其他office suite程序,您可能应该使用CSV或其他字符分隔格式

也可能会感兴趣,但excel用户需要使用这些文档


编辑2:如果您正在使用CSV,您可能希望查看库。

假设您可以避免超出Excel 2007中的新行限制(通过拆分到其他工作表或文件),Excel 2007的xlsx格式应该可以正常工作

因为xLSX是一个zip格式,而不是在内存中创建或写入磁盘,所以应该考虑直接写入内存中的zip流。压缩将保持较低的内存使用率,不写入文件系统将有助于提高性能


另一个可能的解决方案,取决于您的环境:创建一个空白的Access模板,复制并写入该模板,然后发送它而不是Excel文件。当然,这对您的应用程序来说是一个转变,但Access不会有相同的行限制。

确保您的测试代表实际数据。Excel处理简单数字单元格的效率远远高于简单文本单元格,尤其是当所有文本单元格都是唯一的时。因此,如果您的数据真的由10个字符的唯一字符串组成,请务必将其用作您的测试用例。如果它实际上主要是数字,请确保您的测试反映了这一事实

比如说。我构建了一个简单的测试,用于生成一个300000行50列的开放式XML(.xlsx)工作簿。在我使用了将近两年的超频QX6850 CPU上,创建并保存具有唯一数字的工作簿需要13.62秒,而创建和保存一个300000行50列。具有10个字符唯一字符串的xlsx工作簿需要78秒—文本比数字长6倍。我将粘贴下面的代码,您可以使用免费的SpreadsheetGear试用版运行它,您可以下载该试用版

请务必注意,Open XML(.xlsx)是压缩的,因此,如果您的数据有很多冗余,则使用.xlsx可能会得到比使用.csv更小的文件。如果您在web服务器上生成工作簿以通过网络使用,这可能会对性能产生很大影响

使用IWorkbook.SaveToStream方法的SpreadsheetGear以及大多数其他与Excel兼容的第三方库将允许您直接以
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SpreadsheetGear;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            var timer = System.Diagnostics.Stopwatch.StartNew();
            int rows = 300000;
            int sheets = 1;
            var workbook = Factory.GetWorkbook();
            var sb = new System.Text.StringBuilder();
            int counter = 0;
            bool numeric = true;
            for (int sheet = 0; sheet < sheets; sheet++)
            {
                // Use the SpreadsheetGear Advanced API which is faster than the IRange API.
                var worksheet = (sheet == 0) ? workbook.Worksheets[0] : workbook.Worksheets.Add();
                var values = (SpreadsheetGear.Advanced.Cells.IValues)worksheet;
                for (int row = 0; row < rows; row++)
                {
                    for (int col = 0; col < 50; col++)
                    {
                        if (numeric)
                            values.SetNumber(row, col, ++counter);
                        else
                        {
                            sb.Length = 0;
                            // Make a 10 character unique string.
                            sb.Append(++counter);
                            System.Diagnostics.Debug.Assert(sb.Length <= 10);
                            // Make it 10 characters long.
                            while (sb.Length < 10)
                                sb.Append((char)('A' + (char)sb.Length));
                            values.SetText(row, col, sb);
                        }
                    }
                }
            }
            Console.WriteLine("Created {0} cells in {1} seconds.", counter, timer.Elapsed.TotalSeconds);
            workbook.SaveAs(@"C:\tmp\BigWorkbook.xlsx", FileFormat.OpenXMLWorkbook);
            Console.WriteLine("Created and saved {0} cells in {1} seconds.", counter, timer.Elapsed.TotalSeconds);
        }
    }
}