Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更快地创建Excel(互操作)_C#_Excel - Fatal编程技术网

C# 更快地创建Excel(互操作)

C# 更快地创建Excel(互操作),c#,excel,C#,Excel,我将减慢进程的代码识别为以下代码(我正在填充单元格): 我在这里做的基本上是使用数据集从数据库加载一些数据 Microsoft.Office.Interop.Excel.Range range1 = null; Microsoft.Office.Interop.Excel.Range cell1 = null; Microsoft.Office.Interop.Excel.Borders border1 = null; for (i = 0; i <= ds.Tables[0].Rows

我将减慢进程的代码识别为以下代码(我正在填充单元格):

我在这里做的基本上是使用数据集从数据库加载一些数据

Microsoft.Office.Interop.Excel.Range range1 = null;
Microsoft.Office.Interop.Excel.Range cell1 = null;
Microsoft.Office.Interop.Excel.Borders border1 = null;

for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
    int s = i + 1;
    for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
    {
        data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
        xlWorkSheet.Cells[s + 1, j + 1] = data;

        range1 = xlWorkSheet.UsedRange;
        cell1 = range1.Cells[s + 1, j + 1];
        border1 = cell1.Borders;


        if (((IList)terms).Contains(xlWorkSheet.Cells[1, j + 1].Value.ToString()))
        {
            cell1.Interior.Color = System.Drawing.Color.Red;
        }

        range1.Columns.AutoFit();
        range1.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

        border1.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
        border1.Weight = 2d;

    }
}
Microsoft.Office.Interop.Excel.Range range1=null;
Microsoft.Office.Interop.Excel.Range cell1=null;
Microsoft.Office.Interop.Excel.Borders border1=null;

对于(i=0;iInterop库,速度非常慢,需要花费大量的系统资源

您不必使用互操作库来创建Excel文件,只需使用OpenXML库即可。 我在生产中使用它。超过100万行,将数据集导出到excel文件只需10秒钟

以下是引用的示例代码:

private void ExportDSToExcel(数据集ds,字符串目标)
{
使用(var工作簿=SpreadsheetDocument.Create(目标,DocumentFormat.OpenXml.SpreadsheetDocumentType.工作簿))
{
var workbookPart=workbook.AddWorkbookPart();
workbook.WorkbookPart.workbook=newdocumentformat.OpenXml.Spreadsheet.workbook();
workbook.WorkbookPart.workbook.Sheets=新文档格式.OpenXml.Spreadsheet.Sheets();
uint sheetId=1;
foreach(ds.Tables中的数据表)
{
var sheetPart=workbook.WorkbookPart.AddNewPart();
var sheetData=new DocumentFormat.OpenXml.Spreadsheet.sheetData();
sheetPart.Worksheet=newdocumentformat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets=工作簿.WorkbookPart.workbook.GetFirstChild();
string relationshipId=工作簿.WorkbookPart.GetIdOfPart(sheetPart);
如果(sheets.Elements().Count()>0)
{
床单=
sheets.Elements().Select(s=>s.SheetId.Value).Max()+1;
}
DocumentFormat.OpenXml.Spreadsheet.Sheet Sheet=新的DocumentFormat.OpenXml.Spreadsheet.Sheet(){Id=relationshipId,SheetId=SheetId,Name=table.TableName};
附页(页);
DocumentFormat.OpenXml.Spreadsheet.Row headerRow=新的DocumentFormat.OpenXml.Spreadsheet.Row();
列表列=新列表();
foreach(table.Columns中的DataColumn列)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell=新DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType=DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue=newdocumentformat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
头附子(单元);
}
sheetData.AppendChild(headerRow);
foreach(table.Rows中的数据行dsrow)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow=新DocumentFormat.OpenXml.Spreadsheet.Row();
foreach(列中的字符串列)
{
DocumentFormat.OpenXml.Spreadsheet.Cell=新DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType=DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue=newdocumentformat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString())//
newRow.AppendChild(单元格);
}
sheetData.AppendChild(纽罗);
}
}
}
}

互操作库速度非常慢,需要花费大量的系统资源

您不必使用互操作库来创建Excel文件,只需使用OpenXML库即可。 我在生产中使用它。超过100万行,将数据集导出到excel文件只需10秒钟

以下是引用的示例代码:

private void ExportDSToExcel(数据集ds,字符串目标)
{
使用(var工作簿=SpreadsheetDocument.Create(目标,DocumentFormat.OpenXml.SpreadsheetDocumentType.工作簿))
{
var workbookPart=workbook.AddWorkbookPart();
workbook.WorkbookPart.workbook=newdocumentformat.OpenXml.Spreadsheet.workbook();
workbook.WorkbookPart.workbook.Sheets=新文档格式.OpenXml.Spreadsheet.Sheets();
uint sheetId=1;
foreach(ds.Tables中的数据表)
{
var sheetPart=workbook.WorkbookPart.AddNewPart();
var sheetData=new DocumentFormat.OpenXml.Spreadsheet.sheetData();
sheetPart.Worksheet=newdocumentformat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets=工作簿.WorkbookPart.workbook.GetFirstChild();
string relationshipId=工作簿.WorkbookPart.GetIdOfPart(sheetPart);
如果(sheets.Elements().Count()>0)
{
床单=
sheets.Elements().Select(s=>s.SheetId.Value).Max()+1;
}
DocumentFormat.OpenXml.Spreadsheet.Sheet Sheet=新的DocumentFormat.OpenXml.Spreadsheet.Sheet(){Id=relationshipId,SheetId=SheetId,Name=table.TableName};
附页(页);
DocumentFormat.OpenXml.Spreadsheet.Row headerRow=新的DocumentFormat.OpenXml.Spreadsheet.Row();
列表列=新列表();
foreach(table.Columns中的DataColumn列)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell=新DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType=DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue=newdocumentformat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
头附子(单元);
}
sheetData.AppendChild(headerRow);
foreach(table.Rows中的数据行dsrow)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRo
private void ExportDSToExcel(DataSet ds, string destination)
{
    using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
    {
        var workbookPart = workbook.AddWorkbookPart();
        workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
        workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

        uint sheetId = 1;

        foreach (DataTable table in ds.Tables)
        {
            var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
            sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);                

            DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
            string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);

            if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
            {
                sheetId =
                    sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
            sheets.Append(sheet);

            DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

            List<String> columns = new List<string>();
            foreach (DataColumn column in table.Columns)
            {
                columns.Add(column.ColumnName);

                DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }

            sheetData.AppendChild(headerRow);

            foreach (DataRow dsrow in table.Rows)
            {
                DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
                foreach (String col in columns)
                {
                    DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                    cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                    cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
                    newRow.AppendChild(cell);
                }

                sheetData.AppendChild(newRow);
            }
        }
    }
}