我正在使用Office2007PIA将现有的用VS2008编写的插件转换为使用NetOffice的更通用的插件。
使用netoffice框架似乎可以很好地编译一切(只需对代码进行一些小的修改)。
但我的问题是,从word doc中复制inlineshapes的唯一方法是使用剪贴板,在netoffice示例中,我的剪贴板值总是为null。在google上看到,这似乎与剪贴板的线程问题有关。从本质上讲,我的代码发生了变化,所以我只能假设它与Netoffice如何创建它的代理有关。
有人能帮上忙吗?
void commandBarBtn_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
{
string str = _wordApplication.ActiveDocument.Content.Text;
MessageBox.Show(str);
try
{
int count = _wordApplication.ActiveDocument.InlineShapes.Count;
for (int i = 0; i < count; i++)
{
//Clipboard.Clear();
Word.InlineShape shape = _wordApplication.ActiveDocument.InlineShapes[i + 1];
shape.Select();
_wordApplication.Selection.CopyAsPicture();
IDataObject data = Clipboard.GetDataObject(); //always returns null. help!
if (data.GetDataPresent(DataFormats.Bitmap))
{
Bitmap bmp = (System.Drawing.Bitmap)data.GetData(DataFormats.Bitmap);
string filename = String.Format(@"c:\image{0}.bmp", i.ToString());
bmp.Save(filename);
}
//Application.ActiveDocument.InlineShapes
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
Ctrl.Dispose();
}发布于 2013-07-18 18:50:02
这基本上就是我让它工作的原因。我仍然不是百分之百确定为什么我需要这样做。从本质上讲,您只能从静态线程访问剪贴板,而NetOffice系统似乎会在某个地方派生线程。
以下是我为使其正常工作所做的工作
IDataObject data = null;
Exception threadEx = null;
Thread staThread = new Thread(
delegate()
{
try
{
data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Bitmap))
{
Bitmap bmp = (System.Drawing.Bitmap)data.GetData(DataFormats.Bitmap);
string filename = String.Format(@"c:\image{0}.bmp", i.ToString());
bmp.Save(filename);
}
}
catch (Exception ex)
{
threadEx = ex;
}
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();https://stackoverflow.com/questions/17531140
复制相似问题