C# 从自定义对象写入excel工作表

C# 从自定义对象写入excel工作表,c#,excel,loading,cell,worksheet,C#,Excel,Loading,Cell,Worksheet,我有一个客户端应用程序(excel插件),可以从WCF服务器检索数据 这些是课程: public class myWorksheet { public int Id { get; set; } public string WorksheetName { get; set; } public List<myData> MyDataChildren { get; set; } public List<string>

我有一个客户端应用程序(excel插件),可以从WCF服务器检索数据

这些是课程:

    public class myWorksheet
    {
      public int Id { get; set; }
      public string WorksheetName { get; set; }
      public List<myData> MyDataChildren { get; set; }
      public List<string> Dependencies { get; set; }
    }

    public class myData
    {
      public int Id { get; set; }
      public int WorksheetId { get; set; }
      public int RowId { get; set; }
      public string ColumnId { get; set; }
      public string Value { get; set; }
      public string Formula { get; set; }
      public string Comment { get; set; }
    }
公共类myWorksheet
{
公共int Id{get;set;}
公共字符串工作表名称{get;set;}
公共列表MyDataChildren{get;set;}
公共列表依赖项{get;set;}
}
公共类myData
{
公共int Id{get;set;}
公共int工作表{get;set;}
public int RowId{get;set;}
公共字符串列ID{get;set;}
公共字符串值{get;set;}
公共字符串公式{get;set;}
公共字符串注释{get;set;}
}
依赖关系 -当前工作表引用的工作表名称列表(在公式中)

我从WCF(实际上是IEnumerable)检索列表,并将该数据保存在客户机上。 问题是,当我将数据写入excel时,需要花费很长的时间

我正在做的是:

  • 在工作簿中创建空工作表
  • 激活一个工作表(一个用户当前正在查看)
  • 关于“应用程序激活”事件

    • 首先将所有数据加载到依赖项中的工作表中
    • 将数据加载到用户正在查看的图纸中
  • 像这样:

        public List<myWorksheet> WorksheetList { get; set; }
    
        private void Rebind(myWorksheet currWorksheet, out Excel.Workbook workbook)
        {
    
          foreach (string connectedWorksheet in currWorksheet.Dependencies)
          {
            myWorksheet ws = DataHelper.FindWorksheetFromList(connectedWorksheet, this.WorksheetList);
            Excel.Worksheet sheet = DataHelper.FindWorksheetFromWorkbook(connectedWorksheet,workbook);
    
            this.LoadData(sheet,ws);
          }
    
    
            Excel.Worksheet sheetMain = DataHelper.FindWorksheetFromWorkbook(currWorksheet.WorksheetName,workbook);
            this.LoadData(sheetMain,currWorksheet);
        }
    
        private void LoadData(Excel.Worksheet worksheet, myWorksheet worksheetEnt)
        {
            foreach (myData cell in worksheetEnt.MyDataChildren)
            {
                Excel.Range excelCell = worksheet.Range(cell.ColumnId.ToString() + cell.RowId.ToString());
                excelCell.Value2 = cell.Value;
                excelCell.Formula = cell.Formula;
                excelCell.AddComment(cell.Comment);
            }
        }
    
    公共列表工作表列表{get;set;}
    私人作废重新绑定(我的工作表、我的工作表、我的Excel.工作簿)
    {
    foreach(currWorksheet.Dependencies中的字符串connectedWorksheet)
    {
    myWorksheet ws=DataHelper.FindWorksheetFromList(connectedWorksheet,this.WorksheetList);
    Excel.Worksheet sheet=DataHelper.FindWorksheetFromWorkbook(connectedWorksheet,workbook);
    这是一个加载数据(表,ws);
    }
    Excel.Worksheet sheetMain=DataHelper.FindWorksheetFromWorkbook(currWorksheet.WorksheetName,工作簿);
    此.LoadData(sheetMain、currWorksheet);
    }
    专用void LoadData(Excel.Worksheet工作表,myWorksheet工作表)
    {
    foreach(worksheetEnt.MyDataChildren中的myData单元格)
    {
    Excel.Range excelCell=worksheet.Range(cell.ColumnId.ToString()+cell.RowId.ToString());
    excelCell.Value2=cell.Value;
    excelCell.Formula=cell.Formula;
    excelCell.AddComment(cell.Comment);
    }
    }
    
    问题是:

    • 清单中大约有400张工作表
    • 每个工作表大约有2000个单元格(myData)
    • 有些工作表有大约200个依赖项。(加载依赖项需要15分钟)

    • 这个迭代是我做错的吗?有没有更好/更快的方法我不知道


      • 设法解决了这个问题

        尝试

        • 使用数组在数据中布线
        • 将Application.ScreenUpdate设置为False
        这有点帮助。但真正起作用的是

        • Application.Calculation=Excel.XlCalculation.XlCalculation手册
        现在我的代码如下所示:

        private void Rebind(myWorksheet currWorksheet, out Excel.Workbook workbook)
        {
        
          currWorksheet.Application.Calculation = Excel.XlCalculation.xlCalculationManual
          currWorksheet.Application.ScreenUpdating=False
        
          foreach (string connectedWorksheet in currWorksheet.Dependencies)
          {
            myWorksheet ws = DataHelper.FindWorksheetFromList(connectedWorksheet, this.WorksheetList);
            Excel.Worksheet sheet = DataHelper.FindWorksheetFromWorkbook(connectedWorksheet,workbook);
        
            this.LoadData(sheet,ws);
          }
        
          Excel.Worksheet sheetMain = DataHelper.FindWorksheetFromWorkbook(currWorksheet.WorksheetName,workbook);
          this.LoadData(sheetMain,currWorksheet);
        
          currWorksheet.Application.Calculation = Excel.XlCalculation.xlCalculationAutomatic
          currWorksheet.Application.ScreenUpdating=True
         }