C# 高效地将数据输入Excel

C# 高效地将数据输入Excel,c#,excel,C#,Excel,我需要将系统中的数据写入Excel。它需要分布在7张纸上,30万行数据(我的每行数据大约有10个单元格)。写入数据大约需要5分钟。我想知道是否有人能就如何提高效率向我提供建议 现在,对于我的每一行数据,我都访问工作簿并写出数据 private void Form1_Load(object sender, EventArgs e) { DataTable dt1 = new DataTable(); DataTable dt2 = new DataTable(); app

我需要将系统中的数据写入Excel。它需要分布在7张纸上,30万行数据(我的每行数据大约有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];
        }
    }
}
private void Form1\u加载(对象发送方,事件参数e)
{
DataTable dt1=新DataTable();
DataTable dt2=新的DataTable();
app=新的Excel.Application();
工作簿=app.Workbooks.Add();
初始表(dt1);
初始表(dt2);
AddRowsToTable(dt1);
AddRowsToTable(dt2);
地址表(dt1);
地址表(dt2);
工作簿.SaveAs(路径);
}
void AddSheet(数据表)
{
Excel.工作表;
工作表=(Excel.workSheet)工作簿.Worksheets.Add();
//添加列
for(int i=0;i
使用EPPlus,它比我遇到的任何其他东西都容易10倍

使用图书馆。它是OpenXML的包装器,但OpenXML使用起来非常困难。因为它是一个包装器,您仍然需要引用OpenXML,但是您得到了

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

下面是一个添加数据的示例<代码>工作表.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; }
}
类程序
{
静态void Main(字符串[]参数)
{
List md=新列表();
md.Add(new MyData(){col1=“abc”,col2=“123”,col3=“xyz”});
md.Add(newmydata(){col1=“ABC”,col2=“gth”,col3=“DDD”});
md.Add(newmydata(){col1=“45df”,col2=“987”,col3=“BUR”});
var工作簿=新的XLWorkbook();
var工作表=工作簿。工作表。添加(“样本表”);
工作表。单元格(“A1”)。插入数据(md);
工作簿.SaveAs(@“C:/mydata.xlsx”);
}
}
公共类MyData
{
公共字符串col1{get;set;}
公共字符串col2{get;set;}
公共字符串col3{get;set;}
}
给我一个Excel文档,看起来像


我一直在为.NET使用Aspose单元格。简单易用。 以下是一个例子:

 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
}
公共类程序
{
公共静态void Main()
{
//文档目录的路径。
字符串dataDir=Path.GetFullPath(“../../../Data/”);
//指定所需的矩阵
int ROWSCONT=10000;
int colscont=30;
var工作簿=新工作簿();
var ooxmlSaveOptions=新的ooxmlSaveOptions();
ooxmlSaveOptions.lightcellsdaptaprovider=新的测试数据提供程序(工作簿、行列表、列列表);
保存(dataDir+“output.xlsx”,ooxmlSaveOptions);
}
}
类TestDataProvider:LightCellsDataProvider
{
私有int_行=-1;
私有int_列=-1;
私有int-maxRows;
私有int-maxColumns;
私人工作手册;
公共TestDataProvider(工作簿、int-maxRows、int-maxColumns)
{
此工作簿=工作簿;
this.maxRows=maxRows;
this.maxColumns=maxColumns;
}
#区域LightCellsDataProvider成员
公共bool IsGatherString()
{
返回false;
}
公共int NextCell()
{
++_栏目;
if(_列
您可以使用OLEDB连接,在那里您可以更高效地编写(从某种意义上说,将其用作数据库)虽然它很难使用,但我认为它比您正在使用的库性能好得多。因为omepXML很难使用,所以您应该使用ClosedXML。这是一个简单的包装。这正慢慢成为一个基于观点的话题:我和布拉德在一起。另一个好处是,您实际上不需要安装excel即可使其工作。It api还可以从DataTable、DataSet或DataReader获取输入,因此对应用程序的影响最小
 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
}