C# 高效地将数据输入Excel
我需要将系统中的数据写入Excel。它需要分布在7张纸上,30万行数据(我的每行数据大约有10个单元格)。写入数据大约需要5分钟。我想知道是否有人能就如何提高效率向我提供建议 现在,对于我的每一行数据,我都访问工作簿并写出数据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
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
}