私の頭をテーブルの上で叩いてから、私はOpenXML Excellの調査に専念し、成功しました!
エクセルファイルへのハイパーリンクを挿入する方法を発見しました。私のプログラムは、自分のdataObjectに依存する複数のシートを作成できます。 私はとても興奮しており、皆さんと私の業績を共有したいと思います。
SpreadsheetDocumentとのDataObject
を受け付けパラメータfilePathにしても、私のDataObject
public void CreatePackage(string filePath, List<DataObject> data)
{
using (SpreadsheetDocument document = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)
)
{
CreateParts(document, data);
}
}
CreateParts方法として、あなたは私がメソッドのCreatePackageを作成し、この理由のためSpreadSheetDocumentを作成するために必要なすべてと渡すの初
private void CreateParts(SpreadsheetDocument document, List<DataObject> data)
{
ExtendedFilePropertiesPart extendedFilePropertiesPart = document.AddNewPart<ExtendedFilePropertiesPart>();
extendedFilePropertiesPart.Properties = new Properties();
WorkbookPart workbookPart = document.AddWorkbookPart();
//Create new sheet for every Unique error
GenerateWorkbookPart(workbookPart,data.Count);
//generates new SheetPart for every sheet
GenerateWorkSheetsParts(workbookPart,data);
}
ExtendedFilePropertiesPartがExcellのHyperLinkに依存する理由とその理由はわかりませんでしたが、私は知っていますExcellファイルが破損していても、このハイパーリンクがなければ動作しません。
次はワークブックのために、我々はすべてのシートを開催しますシートを作成する必要もWorkBookPartためワークブックを作成する必要があります。 のシートについては、WorkSheetPartも作成する必要がありますが、これについては後で取り上げます。現在:
private void GenerateWorkbookPart(WorkbookPart workbookPart, int dataCount)
{
Workbook workbook = new Workbook();
Sheets sheets = new Sheets();
Sheet sheet = new Sheet();
for (int i = 1; i < dataCount+2; i++)
{
var relId = "rId" + i;
if (i == 1)
{
sheet = new Sheet()
{
Name = "Main",
SheetId = (uint) i,
Id = relId
};
}
else
{
sheet = new Sheet()
{
Name = "Unique" + (i-1),
SheetId = (uint)i,
Id = relId
};
}
sheets.AppendChild(sheet);
}
workbook.AppendChild(sheets);
workbookPart.Workbook = workbook;
}
なぜ合計カウントに+2を追加しますか?まず何らかの理由で、何らかの理由で、RelationshipId(Id)のシートを0にすることができないので、1から2番目のページから始める必要があります。私のエクセルの最初のページはナビゲーションページなので、スキップします。
私は私の文書のWorkBookPartを作成した後、私は、各シートためWorkSheetPartを作成し、データとそれを移入し始めます。
private void GenerateWorkSheetsParts(WorkbookPart workbookPart, List<DataObject> data)
{
for (int i = 1; i < data.Count+2; i++)
{
var relId = "rId" + i;
if (i == 1)
{
WorksheetPart workSheetPart = workbookPart.AddNewPart<WorksheetPart>(relId);
GenerateWorkSheetPartContent(workSheetPart, i, data);
}
else
{
WorksheetPart workSheetPart = workbookPart.AddNewPart<WorksheetPart>(relId);
GenerateWorkSheetPartContent(workSheetPart, i, data[i-2].NestedObject);
}
}
}
private void GenerateWorkSheetPartContent(WorksheetPart worksheetPart,int indexer, List<NestedObject> data)
{
Worksheet worksheet = new Worksheet();
SheetData sheetData = new SheetData();
Hyperlinks hyperlinks = new Hyperlinks();
if (indexer == 1)
{
sheetData.AppendChild(ConstructHeader("Unique errors", "Count"));
foreach (var @event in data)
{
indexer++;
Row row = new Row();
row.Append(ConstructCell(@event.ErrorMessage, "A" + indexer, CellValues.String), ConstructCell(@event.ListOfErrorsObject.Count.ToString(), CellValues.Number));
sheetData.AppendChild(row);
Hyperlink hyperlink = new Hyperlink()
{
Reference = "A" + indexer,
Location = "Unique" + (indexer - 1)+"!A1",
Display = "Unique" + indexer
};
hyperlinks.AppendChild(hyperlink);
}
worksheet.Append(sheetData, hyperlinks);
worksheetPart.Worksheet = worksheet;
}
else
{
worksheet.AppendChild(sheetData);
worksheetPart.Worksheet = worksheet;
}
}
インデクサ - 私のオブジェクトが次々に行くように、私はが番号をRIDとインデクサが同じであることを確実にし、また、最初の列の行数に等しいことができます。
私はまた、いくつかのヘルパーを最初の行にヘッダを構築し、それは私が行に追加することができ、細胞を構築するより早く助け文字列とConstructCellののparamsを取るConstructHeaderを作りました。また、ハイパーリンクが必要なセルを構築するためのオーバーロードも1つあります。
private Row ConstructHeader(params string[] headers)
{
Row row = new Row();
foreach (var header in headers)
{
row.AppendChild(ConstructCell(header, CellValues.String));
}
return row;
}
private Cell ConstructCell(string value, CellValues dataType)
{
return new Cell()
{
CellValue = new CellValue(value),
DataType = new EnumValue<CellValues>(dataType),
};
}
private Cell ConstructCell(string value, string cellReference, CellValues dataType)
{
return new Cell()
{
CellReference = cellReference,
CellValue = new CellValue(value),
DataType = dataType,
};
}
要約: このコードは、ナビゲーションとのDataObjectからの人口データと他のシートである第1シートとエクセル文書を作成します。これが誰かを助けることを願っています。 また、ご意見やご意見がありましたら、お寄せください。私はそれを聞きたいです。