C# 如何在Execl中添加多个工作薄,高手救命!!!

破碎的脸 2012-12-19 12:45:45
public void OutPutExcel<T>(List<T> data, List<TableMultiHeader> headers, string reportName, int dataStartRowNum, int gzl)
{
if (stream == null)
stream = SpreadsheetReader.Create();
//if (doc == null)
var doc = SpreadsheetDocument.Open(stream, true);
//if (shareStringPart == null)
//{
// shareStringPart = CreateSharedStringTablePart(doc.WorkbookPart);
//}
var sheet = SpreadsheetReader.GetWorksheetPartByName(doc, "Sheet" + gzl.ToString());
if (sheet == null)
{
sheet = InsertWorksheet(doc.WorkbookPart, "Sheet" + gzl.ToString());
}
//if (writer == null)
//{
// writer = new WorksheetWriter(doc, SpreadsheetReader.GetWorksheetPartByName(doc, "Sheet" + gzl.ToString()));
//}
//else
//{

//}
//var writer = new WorksheetWriter(doc, SpreadsheetReader.GetWorksheetPartByName(doc, "Sheet" + gzl.ToString()));
var writer = new WorksheetWriter(doc,sheet);
DataWork<T>(data, headers, dataStartRowNum,doc,writer);
}

private void DataWork<T>(List<T> data, List<TableMultiHeader> headers, int dataStartRowNum,SpreadsheetDocument doc,WorksheetWriter writer)
{
//获取默认样式
var style1 = SpreadsheetStyle.GetDefault(doc);
style1.SetHorizontalAlignment(DocumentFormat.OpenXml.Spreadsheet.HorizontalAlignmentValues.Center);//设置水平居中对齐
style1.SetBorder("000000", DocumentFormat.OpenXml.Spreadsheet.BorderStyleValues.Thin);//设置边框
var styletitle = SpreadsheetStyle.GetDefault(doc);
styletitle.SetHorizontalAlignment(DocumentFormat.OpenXml.Spreadsheet.HorizontalAlignmentValues.Center);//设置水平居中对齐
styletitle.SetVerticalAlignment(DocumentFormat.OpenXml.Spreadsheet.VerticalAlignmentValues.Center);
styletitle.SetBorder("000000", DocumentFormat.OpenXml.Spreadsheet.BorderStyleValues.Thin);//设置边框
styletitle.IsBold = true;
var style3 = SpreadsheetStyle.GetDefault(doc);
foreach (var header in headers)
{
writer.PasteText(header.FirstCell, header.HeaderName, styletitle);
if (header.LastCell != null && header.LastCell != "")
{
writer.MergeCells(header.FirstCell, header.LastCell);
if (header.FirstCell.Length == header.LastCell.Length)
{
writer.SetStyle(styletitle, header.FirstCell, header.LastCell);
}
else
{
writer.SetStyle(styletitle, header.FirstCell, header.FirstCell);
writer.SetStyle(styletitle, header.LastCell, header.LastCell);
}
}
}
for (int i = 0; i < data.Count; i++)
{
PropertyInfo[] ps = data[i].GetType().GetProperties();
for (int j = 0; j < ps.Length; j++)
{
var columnName = SpreadsheetReader.GetColumnName("A", j);//获取列名
var value = ps[j].GetValue(data[i], null);
writer.PasteText(columnName + (i + dataStartRowNum), value == null ? "" : value.ToString(), style1);//写入到单元格
}
}
writer.Save();//在内存中保存文档结构
}
}

/// <summary>
/// 插入worksheet
/// </summary>
/// <param name="workbookPart"></param>
/// <returns></returns>
private static WorksheetPart InsertWorksheet(WorkbookPart workbookPart, string sheetName = null)
{

//创建一个新的WorkssheetPart(后面将用它来容纳具体的Sheet)

WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();

newWorksheetPart.Worksheet = new Worksheet(new SheetData());

newWorksheetPart.Worksheet.Save();



//取得Sheet集合

Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>();

if (sheets == null)
{

sheets = workbookPart.Workbook.AppendChild<Sheets>(new Sheets());

}



string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);



//得到Sheet的唯一序号

uint sheetId = 1;

if (sheets.Elements<Sheet>().Count() > 0)
{

sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;

}



string sheetTempName = "Sheet" + sheetId;



if (sheetName != null)
{

bool hasSameName = false;

//检测是否有重名

foreach (var item in sheets.Elements<Sheet>())
{

if (item.Name == sheetName)
{

hasSameName = true;

break;

}

}

if (!hasSameName)
{

sheetTempName = sheetName;

}

}



//创建Sheet实例并将它与sheets关联

Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetTempName };

sheets.Append(sheet);

workbookPart.Workbook.Save();



return newWorksheetPart;

}

这里在writer.Save()方法中报空指针。。。有没有高手帮忙改改。。。
...全文
177 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
破碎的脸 2012-12-19
  • 打赏
  • 举报
回复
if (stream == null) stream = SpreadsheetReader.Create(); var doc = SpreadsheetDocument.Open(stream, true); var sheet = SpreadsheetReader.GetWorksheetPartByName(doc, "Sheet" + gzl.ToString()); if (sheet == null) { sheet = InsertWorksheet(doc.WorkbookPart, "Sheet" + gzl.ToString()); } 主要是这里,好像添加不进去。。。到了第四张表(Sheet4),那个writer.Save()就报空指针异常了。。。
破碎的脸 2012-12-19
  • 打赏
  • 举报
回复
有没有人能帮忙解答一下???

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧