我正在创建一个 Excel 加载项,该加载项实现IDTExtensibility2
并具有一个使用 Excel 的PublishObjects发布工作表范围的函数
我正在使用 Visual Studio 2008 和 Excel 2007,以下是我的代码:
public class AddIn : IDTExtensibility2
{
private static Application s_Application;
public string PublishRange(Range rng)
{
new Thread(() => DoWork(rng)).Start();
return "OK";
}
private string DoWork(Range rng)
{
try
{
Worksheet sheet = rng.Parent as Worksheet;
Workbook book = sheet.Parent as Workbook;
string name = sheet.Name;
string address = rng.get_Address(Type.Missing,
Type.Missing, XlReferenceStyle.xlA1,
Type.Missing, Type.Missing);
book.PublishObjects.Add(
XlSourceType.xlSourceRange, @"c:\Temp\Output.htm",
name, address, XlHtmlType.xlHtmlStatic, "", "")
.Publish(true);
}
catch (Exception e)
{
return e.Message;
}
}
public void OnConnection(object application, ext_ConnectMode connectMode,
object addInInst, ref Array custom)
{
s_Application = application as Application;
}
// implementation of other interface methods is omitted
}
上面的代码按预期工作,当我的工作簿处于自动公式计算模式时,我得到 Output.htm。
但是,如果工作簿处于手动模式(并且在调试器中我看到它s_Application.Calculation
设置为xlCalculationManual
),则行会Publish(true)
强制活动工作表上的所有 UDF 重新计算。
换句话说,在Publish(true)
完成之前,我再次调用了我的PublishRange()
方法,但这次s_Application.Calculation
设置为xlCalculationAutomatic
.
我还发现同一工作簿中其他工作表上的功能不受影响(不知道为什么)。
问题:有没有办法避免这种计算模式重置?
我自己的函数被调用不是问题,我总是可以在其中添加一些布尔标志,但工作表会有其他函数,我所做的任何事情都不能调用。
顺便说一句,从主线程调用时问题不存在DoWork
,这是特定于运行后台线程的。