C# 如何使用C访问excel书签#

C# 如何使用C访问excel书签#,c#,excel,bookmarks,C#,Excel,Bookmarks,我有一个很大的excel文件,我们必须导入数据库。导入工作正常,但导入需要35秒。客户等不及了。我已经在里面创建了书签 下面是创建书签的链接。 现在我想读一下C代码中的书签。正如我所说,我们有不同的部分,如: 1.分布 2.工作人员 3.资源 4.预算等等 我可以从这段代码直接访问这个标题/部分,我得到了行和列 _Worksheet xlWorksheet = xlWorkbook.Sheets[1]; Range xlRange = xlWorksheet.UsedRange; var ex

我有一个很大的excel文件,我们必须导入数据库。导入工作正常,但导入需要35秒。客户等不及了。我已经在里面创建了书签

下面是创建书签的链接。

现在我想读一下C代码中的书签。正如我所说,我们有不同的部分,如: 1.分布
2.工作人员 3.资源 4.预算等等

我可以从这段代码直接访问这个标题/部分,我得到了行和列

_Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Range xlRange = xlWorksheet.UsedRange;
var externalDprDistribution = xlRange.Find("Distribution");
var colDist = externalDprDistribution.Column;
var rowDist = externalDprDistribution.Row;
但我仍然想在excel工作表中创建书签,然后我想访问c代码中的书签,并从中获取行和列。所以我需要一个代码,可以访问在c中创建的书签#

有什么帮助吗?
关于

如果提取Excel文件,您将看到书签是超链接

<hyperlinks>
  <hyperlink ref="G18" location="Test_Mark1" display="Bookmark1"/>
  <hyperlink ref="G10" r:id="rId1"/>
</hyperlinks>

最近在一个项目中,我写了下面的测试代码来查找书签并更新它们,希望能有所帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO.Packaging;
using System.Xml;
using System.IO;


namespace OpenXMLTest
{
class Program
 {
static void Main(string[] args)
{
    string fileName = @"c:\temp\book1.xlsx";

    Console.WriteLine("Start reading bookmark of excel...");


    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, true))
        {
            WorkbookPart workbookPart = doc.WorkbookPart;

            //find bookmarks
            foreach (var workSheetPart in workbookPart.WorksheetParts)
            {
                var temp = workSheetPart.RootElement.Descendants<Hyperlinks>();
                IEnumerable<Hyperlink> hyperLinks = null;
                if (temp.Count() > 0)
                {
                    hyperLinks = temp.First().Cast<Hyperlink>();
                }

                var workSheet = workSheetPart.Worksheet;

                var cells = workSheet.Descendants<Cell>();

                //loop each cell, find bookmark
                foreach (var c in cells)
                {

                    if (hyperLinks != null && hyperLinks.Count() > 0)
                    {
                        var hyperLink = hyperLinks.SingleOrDefault(x => x.Reference.Value == c.CellReference.Value);
                        if (hyperLink != null)
                        {

                            if (!string.IsNullOrEmpty(hyperLink.Location))
                            {
                                Console.WriteLine("Bookmark.DisplayName : " + hyperLink.Display);
                                Console.WriteLine("Bookmark.Location : " + hyperLink.Location);


                                //update bookmark

                                hyperLink.Location = "BookMark_Test";
                                hyperLink.Display = "updated bookmark";

                                Console.WriteLine("Bookmark.DisplayName after updated : " + hyperLink.Display);
                                Console.WriteLine("Bookmark.Location after updated : " + hyperLink.Location);
                            }


                            //for normal hyperlinks
                            //var hr = workSheetPart.HyperlinkRelationships.SingleOrDefault(x => x.Id == hyperLink.Id);
                            //if (hr != null)
                            //{
                            //    Console.WriteLine(hr.Uri.ToString());
                            //}
                        }
                    }


                    workSheet.Save();
                }

                workbookPart.Workbook.Save();

            }



        }


    }

    Console.ReadKey();

}


}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用DocumentFormat.OpenXml;
使用DocumentFormat.OpenXml.Packaging;
使用DocumentFormat.OpenXml.Spreadsheet;
使用System.IO.Packaging;
使用System.Xml;
使用System.IO;
名称空间OpenXMLTest
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串文件名=@“c:\temp\book1.xlsx”;
Console.WriteLine(“开始阅读excel书签…”);
使用(FileStream fs=newfilestream(文件名,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))
{
使用(SpreadsheetDocument文档=SpreadsheetDocument.Open(fs,true))
{
WorkbookPart WorkbookPart=doc.WorkbookPart;
//查找书签
foreach(workbookPart.WorksheetParts中的var工作表部件)
{
var temp=workSheetPart.RootElement.subjections();
IEnumerable超链接=null;
如果(温度计数()>0)
{
超链接=临时第一个().Cast();
}
var工作表=工作表零件工作表;
var cells=工作表。子体();
//循环每个单元格,查找书签
foreach(单元格中的var c)
{
if(超链接!=null&&hyperLinks.Count()>0)
{
var hyperLink=hyperLinks.SingleOrDefault(x=>x.Reference.Value==c.CellReference.Value);
如果(超链接!=null)
{
如果(!string.IsNullOrEmpty(hyperLink.Location))
{
Console.WriteLine(“Bookmark.DisplayName:+hyperLink.Display”);
Console.WriteLine(“Bookmark.Location:+hyperLink.Location”);
//更新书签
hyperLink.Location=“书签测试”;
hyperLink.Display=“更新的书签”;
Console.WriteLine(“更新后的Bookmark.DisplayName:+hyperLink.Display”);
Console.WriteLine(“更新后的Bookmark.Location:+hyperLink.Location”);
}
//对于普通超链接
//var hr=workSheetPart.HyperlinkRelationships.SingleOrDefault(x=>x.Id==hyperLink.Id);
//如果(hr!=null)
//{
//Console.WriteLine(hr.Uri.ToString());
//}
}
}
工作表。保存();
}
workbookPart.Workbook.Save();
}
}
}
Console.ReadKey();
}
}
}

您应该提到您用于从excel文件中读取的库。@alfoks我已经给出了office dll的参考,这里是Microsoft.office.Interop.excel;书签是指命名范围?如果您只对数据感兴趣,那么直接访问xml可能比通过互操作更快。2007年以后(可能还有2003年)的Excel工作簿只是压缩的XML文件。