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()方法中报空指针。。。有没有高手帮忙改改。。。