我需要将数据从我的系统写入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];
}
}
}
答案 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文档
答案 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
}