如何将 Excel Interop 与 ClosedXml 混合使用:样式

How to mix Excel Interop with ClosedXml: styles

我正在尝试在 Excel VSTO 加载项中实现以下目标:

Copying/applying 来自 Excel 文件原始版本的单元格格式。

原因:在处理Excel个文件时,我们偶尔需要更改文件的style/coloring以便能够只处理某些单元格。处理文件后,我们需要恢复原始单元格格式。为此,我编写了一个 VSTO 加载项。

它读取原始文件,遍历所有使用的单元格并将每个单元格的格式应用于最终文件中的相应单元格(地址)。 它工作正常,但它通过 Interop 打开原始文件——这可能是个问题,因为文件名没有改变。另外:在性能方面不理想。另外:用户在操作过程中看到了原始文件,这可能会造成混淆。

因此我想通过 ClosedXml "open" 原始文件。 这是我卡住的地方:

var xl = Globals.ThisAddIn.Application;
var dest = xl.ActiveWorkbook; //Interop
try
{
    var org = new XLWorkbook(pfad); //ClosedXml
    foreach (IXLWorksheet sheet in org.Worksheets)
    {
        var used = sheet.RangeUsed(true);
        Excel.Worksheet dsheet = dest.Sheets[sheet.Name];
        foreach (IXLCell cel in used.Cells(false))
        {
            var adr = cel.Address;
            var interior = dsheet.Range[adr].Interior;
            interior.Color = cel.Style.Fill.BackgroundColor;
            interior.Pattern = cel.Style.Fill.PatternColor;

            //Crash!
            //HRESULT: 0x800A03EC
            //...
            //...

            var borders = dsheet.Range[adr].Borders;
            var orgbord = cel.Style.Border;

            borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = orgbord.TopBorder;
            //Crash!
            //HRESULT: 0x800A03EC
            //...
            //...
        }
    }
    org.Dispose();
}
catch (Exception ex)
{
        log.WriteLine(ex.Message);
}

我认为问题是在 Excel 互操作中,Color/TintAndShade 等以及边框 linestyle/Weight 等的定义比 ClosedXml 中的定义更细化,这使得两种不兼容?

这里有没有人以前尝试过类似的东西并且知道怎么做?

如果我能以某种方式解决这个问题,这样我就不会受困于所有互操作,那就太好了。

没关系。我通过简单地关闭活动工作簿解决了这个问题,用 ClosedXml 完成所有繁重的工作,然后重新打开:

var xl = Globals.ThisAddIn.Application;
var dest = xl.ActiveWorkbook;
var dpfad = dest.FullName;
dest.Close();
var xdest = new XLWorkbook(dpfad);
var org = new XLWorkbook(pfad);
foreach (IXLWorksheet sheet in org.Worksheets)
{
    var used = sheet.RangeUsed(true);
    IXLWorksheet dsheet;
    xdest.TryGetWorksheet(sheet.Name, out dsheet);

    foreach (IXLCell cel in used.Cells(false))
    {
        var dcel = dsheet.Range(cel.WorksheetRow().RowNumber(),
            cel.WorksheetColumn().ColumnNumber(), cel.WorksheetRow().RowNumber(),
            cel.WorksheetColumn().ColumnNumber());
        dcel.Style = cel.Style;
    }
}
xdest.Save();
xdest.Dispose();
org.Dispose();
xl.Workbooks.Open(dpfad);