C# 从自定义对象写入excel工作表
我有一个客户端应用程序(excel插件),可以从WCF服务器检索数据 这些是课程: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>
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
}