OpenXML如何添加指向另一个工作表的超链接

我正在寻找如何将超链接添加到单元格的示例。 看起来这不像添加文本那么简单。

我得到了这个和平的代码,生成正确的XML,但在Excel链接不出现

private SheetData PopulateSheetWithData(SheetData sheetData, IList<Event> events, SpreadsheetDocument document) { int errorIndex = 0; foreach (var @event in events) { errorIndex++; Hyperlinks hyperlinks = new Hyperlinks(); Hyperlink hyperlink = new Hyperlink() { Location = "UniqueError_" + errorIndex + "!A1", Display = @event.LOG_CORR_KEY, Reference = "A"+(errorIndex+1), Id = "UniqueError_" + errorIndex }; hyperlinks.AppendChild(hyperlink); sheetData.AppendChild(hyperlinks); } return sheetData; } 

难道我做错了什么 ? 我发现这篇文章如何添加超链接,但它看起来太复杂了。 任何帮助这个问题?

所以经过一段时间,我的头撞在桌子上,我决定把重点放在我的OpenXML Excell调查,我成功了!

我发现一个解决scheme,如何插入一个超链接到excell文件,甚至更多,现在我的程序可以创build多个工作表取决于我的dataObject。 我很兴奋,我想和大家分享我的成就。

首先,你需要创buildSpreadSheetDocument,因为这个原因,我创build了一个方法CreatePackage并传递参数filePath和我的数据对象

 public void CreatePackage(string filePath, List<DataObject> data) { using (SpreadsheetDocument document = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook) ) { CreateParts(document, data); } } 

接受SpreadsheetDocumentDataObject的 CreateParts方法

 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); } 

我无法find为什么和如何ExtendedFilePropertiesPart依赖HyperLink在Excell,但我知道肯定的是,没有这个超链接不工作,即使Excell文件将被生成损坏。

接下来,我们需要为WorkBookPart创build工作簿以便工作簿创build我们需要创build的工作簿 ,它将容纳所有工作 。 对于每一张纸,我们还需要创buildWorkSheetPart,但是对于这个我会稍后再回来。 目前:

 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开始,我的Excel中的第一页是导航页面,所以我也跳过了。

在为我的文档创buildWorkBookPart之后,我将开始为每个工作创buildWorkSheetPart并用数据填充它。

 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号码,也等于第一列行号。

我也做了很less的助手ConstructHeader ,它在第一行构造了头文件,并且它需要String和ConstructCell的参数,这有助于更快地构build可以追加到行的单元格。 它也有一个重载构造单元应该是超链接。

  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, }; } 

简介:此代码将创build具有第一张表格的Excell文档作为导航,并使用DataObject中填充的数据创build其他表格。 我希望这会帮助别人。 另外如果您有任何意见或反馈 – 请分享我想听到它。