有效地向Excel输入数据

时间:2014-12-17 17:53:21

标签: c# excel

我需要将数据从我的系统写入Excel。它需要分布在7张以上,以及300,000行数据(我的每行数据大约是10个单元格)。写入数据大约需要5分钟。我想知道是否有人可以告诉我如何提高效率。

现在,对于我的每一行数据,我都会访问工作簿并写出数据。

private void Form1_Load(object sender, EventArgs e)
{
    DataTable dt1 = new DataTable();
    DataTable dt2 = new DataTable();

    app = new Excel.Application();
    workBook = app.Workbooks.Add();

    InitTable(dt1);
    InitTable(dt2);
    AddRowsToTable(dt1);
    AddRowsToTable(dt2);
    AddSheet(dt1);
    AddSheet(dt2);

    workBook.SaveAs(path);

}

void AddSheet(DataTable table)
{
    Excel.Worksheet workSheet;

    workSheet = (Excel.Worksheet)workBook.Worksheets.Add();

    // Add columns
    for (int i = 0; i < table.Columns.Count; i++)
    {
        workSheet.Cells[1, i + 1] = table.Columns[i].ColumnName;
    }

    // Add rows
    for (int iRow = 0; iRow < table.Rows.Count; iRow++)
    {
        for (int iCol = 0; iCol < table.Columns.Count; iCol++)
        {
            workSheet.Cells[iRow + 1, iCol + 1] = table.Rows[iRow][iCol];
        }
    }
}

3 个答案:

答案 0 :(得分:2)

使用EPPlus,它比我遇到的任何其他东西容易10倍。 https://www.nuget.org/packages/EPPlus/

using (ExcelPackage pck = new ExcelPackage(newFile))
{
  ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
  ws.Cells["A1"].LoadFromDataTable(dataTable, true);
  pck.Save();
}

答案 1 :(得分:0)

使用ClosedXML库。它是OpenXML的包装器,但OpenXML非常难以使用。因为它是一个包装器,所以你需要引用OpenXML,但是得到NuGet it

Open / ClosedXML也不需要实例化Excel来创建像Interop那样的文件,所以你不需要安装Excel。它只是使Excel可以接受的XML结构。

这是添加数据的示例。 worksheet.Cell("A1").InsertData()采用任何IEnumerable。

class Program
{
    static void Main(string[] args)
    {
        List<MyData> md = new List<MyData>();
        md.Add(new MyData() {col1="abc", col2="123", col3="xyz" });
        md.Add(new MyData() { col1 = "ABC", col2 = "gth", col3 = "DDD" });
        md.Add(new MyData() { col1 = "45df", col2 = "987", col3 = "BUR" });


        var workbook = new XLWorkbook();
        var worksheet = workbook.Worksheets.Add("Sample Sheet");
        worksheet.Cell("A1").InsertData(md);

        workbook.SaveAs(@"C:/mydata.xlsx");
    }

}

public class MyData
{
    public string col1 { get; set; }
    public string col2 { get; set; }
    public string col3 { get; set; }
}

给我一​​个看起来像

的Excel文档

enter image description here

答案 2 :(得分:0)

我一直在使用Aspose Cells for .NET。简单易用。 这是一个例子:

 public class Program
{
    public static void Main()
    {
        // The path to the documents directory.
        string dataDir = Path.GetFullPath("../../../Data/");

        //Specify your desired matrix
        int rowsCount = 10000;
        int colsCount = 30;

        var workbook = new Workbook();
        var ooxmlSaveOptions = new OoxmlSaveOptions();

        ooxmlSaveOptions.LightCellsDataProvider = new TestDataProvider(workbook, rowsCount, colsCount);

        workbook.Save(dataDir+ "output.xlsx", ooxmlSaveOptions);
    }
}

class TestDataProvider : LightCellsDataProvider
{
    private int _row = -1;
    private int _column = -1;

    private int maxRows;
    private int maxColumns;

    private Workbook _workbook;
    public TestDataProvider(Workbook workbook, int maxRows, int maxColumns)
    {
        this._workbook = workbook;
        this.maxRows = maxRows;
        this.maxColumns = maxColumns;
    }

    #region LightCellsDataProvider Members

    public bool IsGatherString()
    {
        return false;
    }

    public int NextCell()
    {
        ++_column;
        if (_column < this.maxColumns)
            return _column;
        else
        {
            _column = -1;
            return -1;
        }
    }
    public int NextRow()
    {
        ++_row;
        if (_row < this.maxRows)
        {
            _column = -1;
            return _row;
        }
        else
            return -1;
    }

    public void StartCell(Cell cell)
    {
        cell.PutValue(_row + _column);
        if (_row == 1)
        {
        }
        else
        {
            cell.Formula = "=Rand() + A2";
        }
    }

    public void StartRow(Row row)
    {
    }

    public bool StartSheet(int sheetIndex)
    {
        if (sheetIndex == 0)
        {
            return true;
        }
        else
            return false;
    }

    #endregion
}