如何在C#中优化Excel表的读取?

时间:2017-02-22 23:52:53

标签: c# excel

我正在开发一个解析大约5500x9单元格范围的应用程序,我确实设法以某种方式运行基础知识,但我对此非常新,而且解决方案非常基础,甚至花了很多时间得到100行,更不用说5.5k了,现在我被困在这里,因为到目前为止我检查过的任何教程都没有用,或者与我目前的代码相比没有提供更好的性能。

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Open(@"C:\...\report.xlsx", 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        Excel.Range range = xlWorkSheet.UsedRange;
        int rows = range.Rows.Count;

        for (int i = 2; i <= 15; i++)
        {
            Devices.Add(new DeviceInfo((string)(range.Cells[i, 1] as Excel.Range).Value2, (string)(range.Cells[i, 2] as Excel.Range).Value2, (string)(range.Cells[i, 3] as Excel.Range).Value2, (string)(range.Cells[i, 4] as Excel.Range).Value2, (string)(range.Cells[i, 5] as Excel.Range).Value2, (string)(range.Cells[i, 6] as Excel.Range).Value2, (string)(range.Cells[i, 7] as Excel.Range).Value2, (string)(range.Cells[i, 8] as Excel.Range).Value2, (string)(range.Cells[i, 9] as Excel.Range).Value2, (string)(range.Cells[i, 10] as Excel.Range).Value2, Convert.ToDateTime((range.Cells[i, 11] as Excel.Range).Value2), Convert.ToDateTime((range.Cells[i, 12] as Excel.Range).Value2)));
        }

        xlWorkBook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
        xlApp.Quit();

唯一想到的是将整行作为单个范围读取,然后在构造函数中处理该数据。但是,我不相信它会变得实用,因为它仍然需要花费大量时间来获取所有数据。

DeviceInfo类只是与Excel工作表中的列匹配的属性列表。

1 个答案:

答案 0 :(得分:4)

我最近也有类似的要求,最后使用 EPPlus 4.1.0

这是一个优秀的图书馆,已经存在了一段时间,有很好的文档记录,并且积极维护。

enter image description here

您可以使用程序包管理器控制台安装Nuget package

enter image description here

他们的Samples Solution涵盖了所有带代码的用例,您可以直接复制粘贴,只需修改一些内容就可以了。你好了。

是的,它的速度非常快!**

以下是您的用例的示例代码。取自Codeplex网站上的Samples Project。

/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 * 
 * All rights reserved.
 * 
 * EPPlus is an Open Source project provided under the 
 * GNU General Public License (GPL) as published by the 
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 * 
 * EPPlus provides server-side generation of Excel 2007 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 *
 * 
 * The GNU General Public License can be viewed at http://www.opensource.org/licenses/gpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 * 
 * The code for this project may be used and redistributed by any means PROVIDING it is 
 * not sold for profit without the author's written consent, and providing that this notice 
 * and the author's name and all copyright notices remain intact.
 * 
 * All code and executables are provided "as is" with no warranty either express or implied. 
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 *
 * Code change notes:
 * 
 * Author                           Change                      Date
 *******************************************************************************
 * Jan Källman      Added       10-SEP-2009
 *******************************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using OfficeOpenXml;

namespace EPPlusSamples
{
    /// <summary>
    /// Simply opens an existing file and reads some values and properties
    /// </summary>
    class Sample2
    {
        public static void RunSample2(string FilePath)
        {
            Console.WriteLine("Reading column 2 of {0}", FilePath);
            Console.WriteLine();

            FileInfo existingFile = new FileInfo(FilePath);
            using (ExcelPackage package = new ExcelPackage(existingFile))
            {
                // get the first worksheet in the workbook
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                int col = 2; //The item description
                // output the data in column 2
                for (int row = 2; row < 5; row++)
                    Console.WriteLine("\tCell({0},{1}).Value={2}", row, col, worksheet.Cells[row, col].Value);

                // output the formula in row 5
                Console.WriteLine("\tCell({0},{1}).Formula={2}", 3, 5, worksheet.Cells[3, 5].Formula);                
                Console.WriteLine("\tCell({0},{1}).FormulaR1C1={2}", 3, 5, worksheet.Cells[3, 5].FormulaR1C1);

                // output the formula in row 5
                Console.WriteLine("\tCell({0},{1}).Formula={2}", 5, 3, worksheet.Cells[5, 3].Formula);
                Console.WriteLine("\tCell({0},{1}).FormulaR1C1={2}", 5, 3, worksheet.Cells[5, 3].FormulaR1C1);

            } // the using statement automatically calls Dispose() which closes the package.

            Console.WriteLine();
            Console.WriteLine("Sample 2 complete");
            Console.WriteLine();
        }
    }
}

(** =如果您发现用例的性能不可接受,那么您可以查看EPPlus的这个分支,修复一些性能问题。

https://github.com/RadoslavGatev/EPPlus-Performance

请注意,这些性能问题适用于非常大的Excel数据集 - 我们在100s和1000s表中讨论50,000多个单元 - 大多数用例都不会遇到它。 )