【发布时间】:2016-01-29 14:38:42
【问题描述】:
有人知道如何在 Excel 中通过 OpenXML SDK 设置打印区域吗?
我尝试过使用以下代码:
public void XLUpdateDefinedName(string fileName, string definedName, string newRange)
{
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, true))
{
WorkbookPart wbPart = document.WorkbookPart;
var definedNames = wbPart.Workbook.Descendants<DefinedNames>().FirstOrDefault();
DefinedName name = definedNames.Descendants<DefinedName>().Where(m => m.Name == definedName).Single();
UInt32Value locSheetId = name.LocalSheetId;
name = null;//.Remove();
wbPart.Workbook.Save();
name = new DefinedName() { Name = definedName, LocalSheetId = locSheetId , Text = newRange}
;
wbPart.Workbook.Save();
//newDefinedName.Text = newRange;
//definedNames.Append(newDefinedName);
}
}
更新:
我继续收到来自 excel 的错误消息,指出文件中包含以下代码的不可读内容。
public void XLUpdateDefinedName(string fileName, string definedName, string newRange, string sheet, UInt32Value localId)
{
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, true))
{
String sheetName = sheet;
string topLeft = newRange.Split(':').First();
string bottomRight = newRange.Split(':').Last();
WorkbookPart wbPart = document.WorkbookPart;
var definedNames = wbPart.Workbook.Descendants<DefinedNames>().FirstOrDefault();
var nameCollection = definedNames.Descendants<DefinedName>().Where(m => m.Text.StartsWith(sheetName));
DefinedName name = nameCollection.Count() > 0 ? nameCollection.First() : null;
UInt32Value locSheetId;
if (name != null)
{
locSheetId = name.LocalSheetId;
name.Remove();
wbPart.Workbook.Save();
}
else
{
locSheetId = localId;
}
name = new DefinedName() { Name = "_xlnm.Print_Area", LocalSheetId = locSheetId};
name.Text = String.Format("{0}!{1}:{2}", sheetName,topLeft,bottomRight);
definedNames.Append(name);
wbPart.Workbook.Save();
}}
newRange 的形式为 ($A$10:$C$15)
【问题讨论】:
-
试试这个链接,它可能有帮助,也可能没有帮助..确保查看它提供示例的整个页面..msdn.microsoft.com/en-us/library/cc540662(office.12).aspx
-
感谢您的建议,但实际上发现了,它使用VB自动化设置打印区域。我需要在要复制到新工作簿中的工作表上维护一个打印区域,如果可能的话,我想使用 OpenXml 来完成它,以保持我的应用程序一致。
-
如果它是使用 vb 自动化完成的,为什么不使用 OleAutomation 更好地称为 Interop 或 Com-Interop,如果您使用 C# 进行编码
-
我当前的任务涉及删除 Excel 加载项对 Com-Interop 的依赖。我的公司在 Excel 之上使用自定义计算引擎,使用互操作会导致 Excel 触发真正不必要的计算。最终结果是一个简单的工具,它需要很长时间才能完成一个相对简单的任务。通过删除互操作,我可以通过 OpenXml 操作一个 excel 文档,并在对该文档的所有更改结束时进行一次计算,这反过来又大大减少了完成任务的时间。
-
如果您修改现有的打印区域或为文档中的工作表添加打印区域定义,并且至少已经定义了一个打印区域,则您的代码可以正常工作。这可能是因为在工作簿中创建第一个打印区域定义时添加了一些其他元素。为了使它工作,您应该只使用一个已经定义了一个打印区域的模板。您还可以从方法的参数中删除 localId 和 definedName。