目標:表に基づいて名前が付けられたワークシートと、各ワークシートの最初の行に列名がリストされたスプレッドシートを生成します。これらは実際には、これらのテーブルから構築されたクラスに基づいています。
問題:スプレッドシートを開くと、「読み取れないコンテンツ」が見つかったと表示され、復元するかどうか尋ねられます。はいを選択すると、スプレッドシートは完全に復元されますが、ユーザーはこれを行う必要はありません。
観察: SDK を使用すると、スプレッドシートの内部動作を確認でき、ワークシートの xml 名が実際の問題であることに気付きました。最初にダウンロードされたバージョンでは、Sheet1 から Sheet9 という名前が付けられていますが、Sheet1a から Sheet1f に移動します。したがって、基本的には 16 進数の 1-f で番号を付けます。私がそれを修復した後、彼らは名前を純粋な数値に修正しました。
画像が表示されるかどうかわかりませんが、私の作品がサイトをブロックしているようです :/
注:コードを確認しましたが、これらの内部 xml シートに具体的に名前を付けることができる場所がどこにもないため、どのコードを共有すればよいかわかりませんが、これらのシートを作成しているコードのセクションを投稿しています。
スプレッドシートを作成するメソッド:
public MemoryStream CreatePartsFromAssembly(MemoryStream spreadsheetStrem, Type typeInAssembly)
{
using (SpreadsheetDocument document = SpreadsheetDocument.Create(spreadsheetStrem, SpreadsheetDocumentType.Workbook))
{
//List<Type> types = null;
var types = ExcelTypeHelper.GetTableTypes(typeInAssembly);
ExtendedFilePropertiesPart extendedFilePropertiesPart1 = document.AddNewPart<ExtendedFilePropertiesPart>("rId" + (types.Count).ToString());
GenerateExtendedFilePropertiesPart1Content(extendedFilePropertiesPart1, types);
WorkbookPart workbookPart1 = document.AddWorkbookPart();
GenerateWorkbookPart1Content(workbookPart1, types);
var sharedStringOffsets = new List<int>();
foreach (var type in types)
{
sharedStringOffsets.Add(ExcelTypeHelper.GetPropertyCount(type));
}
//int j = 0;
int sharedStringOffset = 0;
int sharedStringSum = sharedStringOffsets.Sum();
int sharedStringRunningSum = 0;
for (int i = types.Count; i > 0; i--)
{
var type = types[i - 1];
sharedStringRunningSum += sharedStringOffsets[i - 1];
sharedStringOffset = sharedStringSum - sharedStringRunningSum;
WorksheetPart worksheetPart = workbookPart1.AddNewPart<WorksheetPart>("rId" + (i).ToString());
GenerateWorksheetPartContent(worksheetPart, types[i - 1], sharedStringOffset);
//j++;
}
SharedStringTablePart sharedStringTablePart1 = workbookPart1.AddNewPart<SharedStringTablePart>("rId" + (types.Count + 3).ToString());
GenerateSharedStringTablePartContent(sharedStringTablePart1, types);
WorkbookStylesPart workbookStylesPart1 = workbookPart1.AddNewPart<WorkbookStylesPart>("rId" + (types.Count + 2).ToString());
GenerateWorkbookStylesPart1Content(workbookStylesPart1);
ThemePart themePart1 = workbookPart1.AddNewPart<ThemePart>("rId" + (types.Count + 1).ToString());
GenerateThemePart1Content(themePart1);
SetPackageProperties1(document);
}
return spreadsheetStrem;
}
ワークシートを作成するメソッド:
private void GenerateWorksheetPartContent(WorksheetPart worksheetPart, Type type, int sharedStringOffset)
{
var propertyNames = ExcelTypeHelper.GetPropertyNames(type);
string referenceRange = "A1:" + ColumnHeaderFromRowColumn((uint)1, (uint)propertyNames.Count);
Worksheet worksheet = new Worksheet();
worksheet.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
SheetDimension sheetDimension = new SheetDimension() { Reference = referenceRange };
SheetViews sheetViews = new SheetViews();
SheetView sheetView = new SheetView() { WorkbookViewId = (UInt32Value)0U };
Selection selection = new Selection() { ActiveCell = "A2", SequenceOfReferences = new ListValue<StringValue>() { InnerText = "A2" } };
sheetView.Append(selection);
sheetViews.Append(sheetView);
SheetFormatProperties sheetFormatProperties2 = new SheetFormatProperties() { DefaultRowHeight = 15D };
SheetData sheetData = new SheetData();
Row row = new Row() { RowIndex = (UInt32Value)1U, Spans = new ListValue<StringValue>() { InnerText = "1:" + propertyNames.Count } };
for (int i = 0; i < propertyNames.Count; i++)
{
Cell cell = new Cell() { CellReference = ColumnHeaderFromRowColumn((uint)1, (uint)i + 1), DataType = CellValues.SharedString };
CellValue cellValue = new CellValue();
cellValue.Text = (i + sharedStringOffset).ToString(); //Shared string reference
cell.Append(cellValue);
row.Append(cell);
}
sheetData.Append(row);
PageMargins pageMargins = new PageMargins() { Left = 0.7D, Right = 0.7D, Top = 0.75D, Bottom = 0.75D, Header = 0.3D, Footer = 0.3D };
worksheet.Append(sheetDimension);
worksheet.Append(sheetViews);
worksheet.Append(sheetFormatProperties2);
worksheet.Append(sheetData);
worksheet.Append(pageMargins);
worksheetPart.Worksheet = worksheet;
}