代码之家  ›  专栏  ›  技术社区  ›  amurra

使用Open XML SDK 2.0向Excel 2007中的单元格添加超链接

  •  0
  • amurra  · 技术社区  · 14 年前

    我似乎找不到任何关于如何使用OpenXMLSDK2.0在Excel2007中向单元格添加超链接的文档或代码示例。我正在使用以下代码,但是否缺少某个步骤?

    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?

    3 回复  |  直到 12 年前
        1
  •  6
  •   BgRva    12 年前

    另一种可能性(我使用的)是使用 HYPERLINK Excel公式。我需要在每个单元格中创建单独的超链接,但单元格必须显示不同的文本(我必须在单元格中显示跟踪编号,但每个跟踪编号都有一个超链接,指向运营商的网站,并且必须处理多个运营商)。

    一旦我实例化了一个单独的单元,公式就以这种方式应用到每个单元(毫无疑问有很多种方法):

    // ...
    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.
    

    这样,我就可以为每个单元格创建单独的超链接和文本。另外,链接将以默认字体颜色显示,除非您引用了蓝色字体的样式。

    希望这有帮助。

        2
  •  2
  •   Todd Main    14 年前

    我可以使用 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;
    }
    

    然后我使用OpenXMLSDK2.0翻译了这段代码,但它不起作用。似乎是 AddHyperlinkRelationship 方法实际上没有将关系添加到 Res 文件。我不知道为什么,但在我看来,它确实像个虫子。

    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();     
            }
    
        3
  •  1
  •   Todd Main    14 年前

    您应该将它添加到接受超链接的对象中,例如单元格,而不是工作表。像这样的事情应该对你有用:

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