1

Open XML SDK 2.0 を使用して Excel 2007 のセルにハイパーリンクを追加する方法に関するドキュメントやコード サンプルが見つからないようです。次のコードを使用していますが、不足している手順はありますか?

WorksheetPart workSheetPart = ExcelUtilities.GetWorkSheetPart(mWorkBookPart, "Program");

workSheetPart.AddHyperlinkRelationship(new Uri("http://www.google.com", UriKind.Absolute), true);

workSheetPart.Worksheet.Save();

mWorkBookPart.Workbook.Save();

次に、Excel ドキュメントを開こうとすると、ハイパーリンクの関係 ID が見つからないため、ファイルが破損していると表示されます。そのリレーションシップ ID をどのようにセットアップまたは作成しますか?

4

4 に答える 4

8

別の可能性 (私が使用しました) は、Excel のHYPERLINK式を使用することです。各セルに個別のハイパーリンクを作成する必要がありましたが、セルには異なるテキストを表示する必要がありました (セルに追跡番号を表示する必要がありましたが、追跡番号ごとに運送業者のサイトへのハイパーリンクがあり、複数の運送業者を処理する必要がありました)。

個々のセルをインスタンス化したら、この方法で数式を各セルに適用しました (間違いなく多数の方法があります)。

// ...
Cell cell1 = new Cell(){ CellReference = "A1", StyleIndex = (UInt32Value)1U, DataType = CellValues.InlineString };
CellValue cellValue1 = new CellValue();

CellFormula cellFormula1 = new CellFormula() { Space = SpaceProcessingModeValues.Preserve };
cellFormula1.Text = @"HYPERLINK(""http://www.theclash.com"", ""Radio Clash"")";
cellValue1.Text = "Radio Clash";
cell1.Append(cellFormula1);
cell1.Append(cellValue1);
// append cell, etc.

このようにして、セルごとに個別のハイパーリンクとテキストを作成することができました。ちなみに、青いフォントのスタイルを参照しない限り、リンクはデフォルトのフォント色で表示されます。

お役に立てれば。

于 2012-10-25T17:48:47.150 に答える
2

System.IO.Packagingコードを使用してセルにハイパーリンクを追加できました。

private void HyperlinkCreate(PackagePart part, XmlNamespaceManager nsm, XmlNode _cellElement, string CellAddress)
{
        Uri _hyperlink = new Uri("http://www.yahoo.com");
        XmlNode linkParent = _cellElement.OwnerDocument.SelectSingleNode("//d:hyperlinks", nsm);
        if (linkParent == null)
        {
            // create the hyperlinks node
            linkParent = _cellElement.OwnerDocument.CreateElement("hyperlinks", @"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
            XmlNode prevNode = _cellElement.OwnerDocument.SelectSingleNode("//d:conditionalFormatting", nsm);
            if (prevNode == null)
            {
                prevNode = _cellElement.OwnerDocument.SelectSingleNode("//d:mergeCells", nsm);
                if (prevNode == null)
                {
                    prevNode = _cellElement.OwnerDocument.SelectSingleNode("//d:sheetData", nsm);
                }
            }
            _cellElement.OwnerDocument.DocumentElement.InsertAfter(linkParent, prevNode);
        }
        string searchString = string.Format("./d:hyperlink[@ref = '{0}']", CellAddress);
        XmlElement linkNode = (XmlElement)linkParent.SelectSingleNode(searchString, nsm);
        XmlAttribute attr;
        if (linkNode == null)
        {
            linkNode = _cellElement.OwnerDocument.CreateElement("hyperlink", @"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
            // now add cell address attribute
            linkNode.SetAttribute("ref", CellAddress);
            linkParent.AppendChild(linkNode);
        }

        attr = (XmlAttribute)linkNode.Attributes.GetNamedItem("id", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
        if (attr == null)
        {
            attr = _cellElement.OwnerDocument.CreateAttribute("r", "id", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
            linkNode.Attributes.Append(attr);
        }                     

        PackageRelationship relationship = null;
        string relID = attr.Value;
        if (relID == "")
            relationship = part.CreateRelationship(_hyperlink, TargetMode.External, @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink");
        else
        {
            relationship = part.GetRelationship(relID);
            if (relationship.TargetUri != _hyperlink)
                relationship = part.CreateRelationship(_hyperlink, TargetMode.External, @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink");
        }
        attr.Value = relationship.Id;
}

次に、Open XML SDK 2.0 を使用してこのコードを翻訳しましたが、機能しません。このAddHyperlinkRelationshipメソッドは、実際にはリレーションシップを.relsファイルに追加していないようです。理由はわかりませんが、バグのように思えます。

private void HyperlinkCreate(PackagePart part, XmlNamespaceManager nsm, XmlNode _cellElement, string CellAddress)
    {

WorksheetPart workSheetPart = ExcelUtilities.GetWorkSheetPart(mWorkBookPart, "Program");
            Uri hyperlinkUri = new Uri("http://www.yahoo.com", UriKind.Absolute);

            Hyperlinks hyperlinks = workSheetPart.Worksheet.Descendants<Hyperlinks>().FirstOrDefault();

            // Check to see if the <x:hyperlinks> element exists; if not figure out 
            // where to insert it depending on which elements are present in the Worksheet
            if (hyperlinks == null)
            {
                // Create the hyperlinks node
                hyperlinks = new Hyperlinks();

                OpenXmlCompositeElement prevElement = workSheetPart.Worksheet.Descendants<ConditionalFormatting>().FirstOrDefault();
                if (prevElement == null)
                {
                    prevElement = workSheetPart.Worksheet.Descendants<MergeCells>().FirstOrDefault();
                    if (prevElement == null)
                    {
                        // No FirstOrDefault needed since a Worksheet requires SheetData or the excel doc will be corrupt
                        prevElement = workSheetPart.Worksheet.Descendants<SheetData>().First();
                    }
                }
                workSheetPart.Worksheet.InsertAfter(hyperlinks, prevElement);
            }
            Hyperlink hyperlink = hyperlinks.Descendants<Hyperlink>().Where(r => r.Reference.Equals(CellAddress)).FirstOrDefault();
            if (hyperlink == null)
            {
                hyperlink = new Hyperlink() { Reference = CellAddress, Id = string.Empty };

            }

            HyperlinkRelationship hyperlinkRelationship = null;
            string relId = hyperlink.Id;
            if (relId.Equals(string.Empty))
            {
                hyperlinkRelationship = workSheetPart.AddHyperlinkRelationship(hyperlinkUri, true);
            }
            else
            {
                hyperlinkRelationship = workSheetPart.GetReferenceRelationship(relId) as HyperlinkRelationship;
                if (!hyperlinkRelationship.Uri.Equals(hyperlinkUri))
                {
                    hyperlinkRelationship = workSheetPart.AddHyperlinkRelationship(hyperlinkUri, true);
                }
            }
            hyperlink.Id = hyperlinkRelationship.Id;
            hyperlinks.AppendChild<Hyperlink>(hyperlink);
            workSheetPart.Worksheet.Save();     
        }
于 2010-05-27T15:30:44.197 に答える
1

ワークシートではなく、セルなどのハイパーリンクを受け入れるオブジェクトに追加する必要があります。このようなものがうまくいくはずです:

using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;

namespace GeneratedCode
{
    public class GeneratedClass
    {
        // Creates an Worksheet instance and adds its children.
        public Worksheet GenerateWorksheet()
        {
            Worksheet worksheet1 = new Worksheet(){ MCAttributes = new MarkupCompatibilityAttributes(){ Ignorable = "x14ac" }  };
            worksheet1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
            worksheet1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
            worksheet1.AddNamespaceDeclaration("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
            SheetDimension sheetDimension1 = new SheetDimension(){ Reference = "A1" };

            SheetViews sheetViews1 = new SheetViews();
            SheetView sheetView1 = new SheetView(){ TabSelected = true, WorkbookViewId = (UInt32Value)0U };

            sheetViews1.Append(sheetView1);
            SheetFormatProperties sheetFormatProperties1 = new SheetFormatProperties(){ DefaultRowHeight = 14.4D, DyDescent = 0.3D };

            SheetData sheetData1 = new SheetData();

            Row row1 = new Row(){ RowIndex = (UInt32Value)1U, Spans = new ListValue<StringValue>() { InnerText = "1:1" }, DyDescent = 0.3D };

            Cell cell1 = new Cell(){ CellReference = "A1", StyleIndex = (UInt32Value)1U, DataType = CellValues.SharedString };
            CellValue cellValue1 = new CellValue();
            cellValue1.Text = "0";

            cell1.Append(cellValue1);

            row1.Append(cell1);

            sheetData1.Append(row1);

            Hyperlinks hyperlinks1 = new Hyperlinks();
            Hyperlink hyperlink1 = new Hyperlink(){ Reference = "A1", Id = "rId1" };

            hyperlinks1.Append(hyperlink1);
            PageMargins pageMargins1 = new PageMargins(){ Left = 0.7D, Right = 0.7D, Top = 0.75D, Bottom = 0.75D, Header = 0.3D, Footer = 0.3D };

            worksheet1.Append(sheetDimension1);
            worksheet1.Append(sheetViews1);
            worksheet1.Append(sheetFormatProperties1);
            worksheet1.Append(sheetData1);
            worksheet1.Append(hyperlinks1);
            worksheet1.Append(pageMargins1);
            return worksheet1;
        }


    }
}
于 2010-05-26T15:50:42.910 に答える