2017-07-07 10 views
1

私はハイパーリンクをセルに追加する方法の例を探しています。 テキストを追加するほど簡単ではないようです。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; 
    } 

私が何か間違ったことをやっているか?表示されませんか。 私はthis記事ハイパーリンクを追加する方法を見つけましたが、複雑すぎるようです。この質問のお手伝いは?

答えて

0

私の頭をテーブルの上で叩いてから、私は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シートとエクセル文書を作成します。これが誰かを助けることを願っています。 また、ご意見やご意見がありましたら、お寄せください。私はそれを聞きたいです。

関連する問題