c# -复制excel数据到数组的方法

本文关键字:数组 方法 数据 复制 excel | 更新日期: 2023-09-27 17:49:21

我根据老板的规范编写了一些代码。其中一个要求是将大量Excel数据导入程序。我通过将Excel工作表的使用范围复制到剪贴板,然后使用它来写入数组来做到这一点。这是使用Interop完成的。这确实工作得很好,它的代码已经使用了大约4个月没有任何问题。

然而,我在实习之初没有想太多就写了这段代码。现在,我在一个安静的时刻重新审视它,它让我思考,是否有更好(更有效、更优雅)的方法来做到这一点?现在回想起来,这似乎有点hack。

谢谢。

c# -复制excel数据到数组的方法

使用c#驱动程序可以直接读取excel文件,而无需使用interop:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.IO;
namespace Immo.Areas.Administration.Controllers
{
    public class SomethingSometingExcelClass
    {
        public void DoSomethingWithExcel(string filePath)
        {
            List<DataTable> worksheets = ImportExcel(filePath);
            foreach(var item in worksheets){
                foreach (DataRow row in  item.Rows)
                {
                   //add to array
                }
            }
        }
        /// <summary>
        /// Imports Data from Microsoft Excel File.
        /// </summary>
        /// <param name="FileName">Filename from which data need to import</param>
        /// <returns>List of DataTables, based on the number of sheets</returns>
        private List<DataTable> ImportExcel(string FileName)
        {
            List<DataTable> _dataTables = new List<DataTable>();
            string _ConnectionString = string.Empty;
            string _Extension = Path.GetExtension(FileName);
            //Checking for the extentions, if XLS connect using Jet OleDB
            if (_Extension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase))
            {
                _ConnectionString =
                    "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0";
            }
            //Use ACE OleDb
            else if (_Extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
            {
                _ConnectionString =
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0";
            }
            DataTable dataTable = null;
            using (OleDbConnection oleDbConnection =
                new OleDbConnection(string.Format(_ConnectionString, FileName)))
            {
                oleDbConnection.Open();
                //Getting the meta data information.
                //This DataTable will return the details of Sheets in the Excel File.
                DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null);
                foreach (DataRow item in dbSchema.Rows)
                {
                    //reading data from excel to Data Table
                    using (OleDbCommand oleDbCommand = new OleDbCommand())
                    {
                        oleDbCommand.Connection = oleDbConnection;
                        oleDbCommand.CommandText = string.Format("SELECT * FROM [{0}]",
                            item["TABLE_NAME"].ToString());
                        using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter())
                        {
                            oleDbDataAdapter.SelectCommand = oleDbCommand;
                            dataTable = new DataTable(item["TABLE_NAME"].ToString());
                            oleDbDataAdapter.Fill(dataTable);
                            _dataTables.Add(dataTable);
                        }
                    }
                }
            }
            return _dataTables;
        }
    }
}

是的,这绝对是一个hack。如果您使用interop来获取使用的范围,那么您可以直接循环该范围并写入数组,而无需任何剪贴板交互。

下面的内容:

for(int i = 1; i <= sheet.UsedRange.Rows.Count; i++)
{
    for(int j = 1; j <= sheet.UsedRange.Columns.Count; j++)
    {
        DoStuffWith(sheet.UsedRange.Cells(i, j).Value)
    }
}

这是一个hack。

我以前已经成功使用Jet连接(http://connectionstrings.com/excel)。

另一种选择是将Excel电子表格保存为CSV格式,然后自己读取文件。但这可能并不实际,这取决于你的电子表格中的内容。