【发布时间】:2013-01-10 17:43:16
【问题描述】:
我正在尝试使用 OpenXML(SAX 方法)创建 Excel 文档。当我的方法被调用时,我想检查是否已经为给定的键创建了一个选项卡。如果是,我只想在该选项卡的底部附加一行。如果尚未为给定键创建选项卡,我将创建一个新选项卡,例如;
part = wbPart.AddNewPart<WorksheetPart>();
string worksheetName = row.Key[i].ToString();
Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(part), SheetId = sheetNumber, Name = worksheetName };
sheets.Append(sheet);
writer = OpenXmlWriter.Create(part);
writer.WriteStartElement(new Worksheet());
writer.WriteStartElement(new SheetData());
currentrow = 1;
string header = Header + "\t" + wrapper.GetHeaderString(3, 2, -1); //need to fix
WriteDataToExcel(header, currentrow, 0, writer);
currentrow++;
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
如果已经创建了一个选项卡,我会使用以下代码回忆工作表;
private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName)
{
IEnumerable<Sheet> sheets =
document.WorkbookPart.Workbook.GetFirstChild<Sheets>().
Elements<Sheet>().Where(s => s.Name == sheetName);
if (sheets.Count() == 0)
{
// The specified worksheet does not exist.
return null;
}
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)
document.WorkbookPart.GetPartById(relationshipId);
return worksheetPart;
}
当返回正确的工作表部分时,我尝试通过将我的 OpenXmlWriter 指向正确的部分然后添加行来添加新行;
part = GetWorksheetPartByName(document, row.Key[i].ToString());
writer = OpenXmlWriter.Create(part);
writer.WriteStartElement(part.Worksheet);
writer.WriteStartElement(part.Worksheet.GetFirstChild<SheetData>());
SheetData sheetData = part.Worksheet.GetFirstChild<SheetData>();
Row lastRow = sheetData.Elements<Row>().LastOrDefault();
代码会运行,但是我总是只得到一行(我第一次创建选项卡时添加的第一行)。电子表格中不显示任何后续行。
我将添加很多行(超过 50,000 行),并且不希望每次都创建新文件并复制信息。
【问题讨论】:
-
这个相关的 SO 问题可能会有所帮助 - stackoverflow.com/q/6665307/53614(您似乎缺少
InsertAfter部分)