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();
コードは実行されますが、最終的には常に1行(最初にタブを作成したときに追加した最初の行)になります。後続の行はスプレッドシートに表示されません。
たくさんの行(50,000以上)を追加するので、毎回新しいファイルを作成して情報をコピーする必要はありません。