如何使用Open XML SDK 2.5设置活动工作表

8

使用这里的示例如何在工作簿内复制工作表,我已经成功地克隆/复制了我的Excel文件中的表格,但是当我打开Excel时,第二个表格是活动(可见)表格。我还没有找到可以做到这一点的属性......是否有任何方法指定哪个表格是活动的?

我尝试通过打开和编辑文件中的第一个表格来强制执行它,认为最后编辑的表格是活动的,但那也不起作用。

任何帮助都将是非常好的。TIA

更新:当将.xlsx重命名为.zip并查看创建的workbook.xml时,我发现了“activeTab”属性。对我的代码进行了快速更改,似乎工作得很好。

public void SetFirstSheetInFocus(String xlsxFile)
    {
        using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(xlsxFile, true))
        {
            //Get a reference to access the main Workbook part, which contains all references
            WorkbookPart _workbookPart = spreadSheet.WorkbookPart;
            if (_workbookPart != null)
            {
                WorkbookView _workbookView = spreadSheet.WorkbookPart.Workbook.BookViews.ChildElements.First<WorkbookView>();
                if (_workbookView != null)
                {
                    _workbookView.ActiveTab = 0; // 0 for first or whatever tab you want to use
                }      
                // Save the workbook.
                _workbookPart.Workbook.Save();
            }

        }
    }

不确定您的实现进展到哪个阶段,但OpenXML难以处理。我能够比最初创建它更快地重新执行OpenXML实现,并且代码更易读,并且删除了数百行代码。如果还没有太迟,请查看ClosedXML => https://closedxml.codeplex.com/,它可能会挽救您的心智。 - Tony
谢谢Tony,我会看一下的。不幸的是,目前的要求是必须使用Open XML SDK(不允许使用第三方库),但它肯定对未来很有前途。实际上,我已经能够设置活动选项卡了,我之前看错了区域。 - drock19
不要将xlsx文件作为zip文件打开并查看XML,而是使用生产力工具。基本上,您可以起草一个新文件或编辑现有文件,该工具使用反射生成构建文件实例所需的所有代码。 [XML sdk 2.5] (http://www.microsoft.com/en-us/download/details.aspx?id=30425) - Francesco Milani
2个回答

8
如果您的表格名称存在于变量中:
sheetName  

你可以通过以下方式将具有该名称的工作表设置为活动状态:
using (var spreadsheetDoc = SpreadsheetDocument.Open(emptyHIPTemplatePath, true /* isEditable */, new OpenSettings { AutoSave = false }))
{        
    var workbookPart = spreadsheetDoc.WorkbookPart;
    var workBook = spreadsheetDoc.WorkbookPart.Workbook;
    var sheet = workBook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);     

    var sheetIndex = workBook.Descendants<Sheet>().ToList().IndexOf(sheet);
    var workBookView = workBook.Descendants<WorkbookView>().First();
    workBookView.ActiveTab = Convert.ToUInt32(sheetIndex);

    ...
    workBook.Save();            
}

1
请注意,在调用workbook.Save()之后,您需要调用workbook.Close()。 - Jack

1

来自Vincent Tan的书:

SheetId属性不确定顺序。附加Sheet类到Sheets类的顺序决定了它们的顺序。

当你添加一个工作表时,它会获得下一个索引,但单个工作表没有索引。当你添加完工作表时,OpenXML会给它分配一个索引。再次引用Vincent Tan的书:

假设你有三个名为Sheet1、Sheet2和Sheet3的工作表。然而,当你附加相应的Sheet类时,你按照Sheet2、Sheet3和Sheet1的顺序进行了操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接