如何使用List中的Microsoft.Office.Interop.Word创建.docx文档?或者最好的方法是添加docx.dll?
更新.可能是我的第一个问题是痘痘不正确.Microsoft.Office.Interop.Word和DocX.dll有什么区别?在这两种情况下,我是否需要使用Microsft Word来创建和打开.docx文档?
嘿,我是从C#WinForms应用程序自动化PowerPoint和Excel; 我所做的是从PowerPoint中读取幻灯片并将其保存在Excel中,然后退出这两个应用程序.Excel已成功退出,但PowerPoints未退出.问题是,当我第一次转换它不退出时,但当我再次转换时它确实.
这是我的代码
try
{
PowerPoint.Application ppApp;
PowerPoint.Presentation ppPres;
List<Company> companies = new List<Company>();
ppApp = new PowerPoint.Application();
ppApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
ppApp.WindowState = Microsoft.Office.Interop.PowerPoint.PpWindowState.ppWindowMinimized;
ppPres = ppApp.Presentations.Open(fileTxtBox.Text,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoTrue);
int slides = ppPres.Slides.Count;
for (int slide = 1; slide <= slides; slide++)
{
int rows = 1;
PowerPoint.Cell cell;
int shape = 1;
for (; shape < ppPres.Slides[slide].Shapes.Count; shape++)
{
if (ppPres.Slides[slide].Shapes[shape].HasTable == Microsoft.Office.Core.MsoTriState.msoTrue)
{
cell = ppPres.Slides[slide].Shapes[shape].Table.Cell(1, 1);
if (cell.Shape.TextFrame.TextRange.Text.Trim().ToLower().Contains("realized"))
{
rows = ppPres.Slides[slide].Shapes[shape].Table.Rows.Count;
break;
}
}
} …Run Code Online (Sandbox Code Playgroud) 我需要从我的.Net4应用程序自动化办公文档(Word和Excel).
由于我无法真正强迫我的用户使用特定的Office版本,因此我不使用互操作程序集或tlbimp,因此我的项目不包含任何其他引用,如果未安装Office,整个应用程序也将失败(功能刚赢了)不可用).
相反,我问系统哪个COM服务器可以处理"Word.Application"或"Excel.Application":
dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
app.Foo();
Run Code Online (Sandbox Code Playgroud)
我担心如何在完成后正确处理"app"对象,因为现在我有两个内部管理系统需要担心(COM引用计数和.Net引用跟踪).理想情况下,我应该能够将动态app对象包装到一次性包装器类中,并确保在处理包装器时底层COM对象未被引用.
编辑:此外,我想知道当我完成它时如何正确地使COM对象"活着",因为Word是在一个单独的过程中.我应该能够实例化Word应用程序,自动化它,然后释放我的所有引用,但Word应用程序应该保持打开状态.
我有一个Windows服务,通过Microsoft.Office.Interop.Excel.Application对象打开Excel电子表格.
Application xlApp = new Application();
Workbook workbook = xlApp.Workbooks.Open(fileName, 2, false);
...
...
workbook.Close();
xlApp.Quit();
Run Code Online (Sandbox Code Playgroud)
我想杀死完成工作簿使用后剩余的EXCEL.exe进程.
我试过以下但没有成功......
// This returns a processId of 0
IntPtr processId;
GetWindowThreadProcessId(new IntPtr(xlApp.Hwnd), out processId);
Process p = Process.GetProcessById(processId.ToInt32());
p.Kill();
Run Code Online (Sandbox Code Playgroud)
任何人都有任何关于如何通过Windows服务这样做的想法?
可能重复:
如何在C#中正确清理Excel互操作对象
我在这里阅读了许多关于管理COM引用的其他线程,同时使用.Net-Excel互操作来确保Excel进程在退出时正确退出,到目前为止,这些技术已经运行良好,但我最近遇到了一个将新工作表添加到现有工作簿文件时出现问题.
下面的代码留下了僵尸Excel进程.
如果我将工作表添加到新创建的工作簿文件,它将退出正常.如果我运行除.Add()行之外的代码,它会退出.(我正在读取的现有文件是由注释掉的代码创建的空文件)
有任何想法吗?
//using Excel = Microsoft.Office.Interop.Excel;
//using System.Runtime.InteropServices;
public static void AddTest()
{
string filename = @"C:\addtest.xls";
object m = Type.Missing;
Excel.Application excelapp = new Excel.Application();
if (excelapp == null) throw new Exception("Can't start Excel");
Excel.Workbooks wbs = excelapp.Workbooks;
//if I create a new file and then add a worksheet,
//it will exit normally (i.e. if you uncomment the next two lines
//and comment out the .Open() line below):
//Excel.Workbook wb = wbs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
//wb.SaveAs(filename, …Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft.Interropt.Excel DLL编写Excel类.我完成了所有功能,但我的析构函数中有错误.我想将所有更改保存到我的文件中,并且我想要释放所有源代码.我希望所有这些都在我的析构函数中.但在我的析构函数中,Excel.ApplicationClass,Workbook和Worksheet对象由异常填充,其中包含消息"已与其基础RCW分离的COM对象无法使用".所以我不能保存任何东西,什么都不关闭因为ı无法访问工作簿或工作表对象.
我不能在Destructor中访问类私有成员吗?
在Microsoft Office AddIn中,我们在事件中传递COM对象.举一个特定的情况,当Word打开一个文档时,我们被调用并传递一个Document对象.那么我们什么时候需要调用Marshal.ReleaseComObject()?
如果我们错过了发布会怎么样?我们持有的任何COM对象在不确定的时间内包含在我们的类中,并且实现了IDisposable.我们完成后调用Dispose().但是处理这个问题的一些代码很复杂,我猜我们偶尔会遇到一个不调用Dispose的情况.
我们最好有一个终结器,然后为这些对象的每个实例增加开销(很多!)?或者我们最好使用少量从未发布的Word COM对象?
谢谢 - 戴夫
如何从正在运行的对象中获取进程ID?
Dim xlApp As Object = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)
我需要使用后期绑定,因为我无法保证我将获得哪个版本,因此使用Microsoft.Office.Interop.Excel将无法正常工作.
'do some work with xlApp
xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = nothing
Run Code Online (Sandbox Code Playgroud)
此时Excel仍在后台运行.我熟悉使用变量的所有建议并释放它们然后使用:System.Runtime.InteropServices.Marshal.ReleaseComObject(o).这不能可靠地工作.我正在做的工作非常复杂.我使用多个文件用于每个循环等.无法在Excel中释放所有资源.我需要一个更好的选择.
我想Process.Kill在Excel 上使用,但我不知道如何从xlApp对象获取进程.我不想杀死所有Excel进程,因为用户可能打开了工作簿.
我尝试使用Dim xProc As Process = Process.Start(ExcelPath)然后使用xProc.Kill()有时工作除了使用XLApp = GetObject("Book1").Application或XLApp = GetObject("", "Excel.Application")如果用户已经打开Excel窗口使用正确的Excel对象有点棘手.我需要一个更好的选择.
我不能使用GetActiveObject或BindToMoniker获取Excel对象,因为它们仅在使用早期绑定时才能工作.例如Microsoft.Office.Interop.Excel
如何从正在运行的对象中获取进程ID?
编辑:其实我真的不想对如何让Excel很好地退出进行重新考虑.许多其他问题都解决了这个问题 在这里和这里我只想杀死它; 干净,准确,直接.我想要杀死我开始的确切过程而不是其他过程.
我有这个C#程序永远不会关闭Excel进程.基本上,它查找字符串在Excel中的范围中出现的实例数.我尝试了各种各样的东西,但它没有用.有一个Form调用此方法,但这不应该更改进程未关闭的原因.我看看Hans Passant的建议,但都没有.
编辑:我尝试了提到的东西,它仍然不会关闭.这是我更新的代码.编辑:尝试整个Process.Kill(),它的工作原理,但它似乎是一个应该工作的东西的黑客攻击.
public class CompareHelper
{
// Define Variables
Excel.Application excelApp = null;
Excel.Workbooks wkbks = null;
Excel.Workbook wkbk = null;
Excel.Worksheet wksht = null;
Dictionary<String, int> map = new Dictionary<String, int>();
// Compare columns
public void GetCounts(string startrow, string endrow, string columnsin, System.Windows.Forms.TextBox results, string excelFile)
{
results.Text = "";
try
{
// Create an instance of Microsoft Excel and make it invisible
excelApp = new Excel.Application();
excelApp.Visible = false;
// open a Workbook and get the active …Run Code Online (Sandbox Code Playgroud) 环境:
应用程序(用C#编写的.Net 4)最多有10个线程,每个线程都在自己的AppDomain中运行.每个线程都使用ADO.Net DataReader从SQL-Server 2008上获取存储过程的结果.另外一个线程可以使用ADO.Net来执行写操作(Bulk Insert).一切都在本地机器上运行.
问题#1:
偶尔(大约每30次运行)线程的执行会急剧减慢.当DataReader获取存储过程结果时会发生这种情况 - SqlCommand.ExecuteReader().通常读操作在10秒内执行.当它减速时,它会在10-20分钟内执行.SQLProfiler显示正在查询数据,但速度非常慢.
缓和的调用堆栈(请注意,没有例外):
at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32 )
at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
at System.Data.SqlClient.TdsParserStateObject.ReadString(Int32 length)
at System.Data.SqlClient.TdsParser.ReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, Encoding encoding, Boolean isPlp, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ReadColumnData()
at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at …Run Code Online (Sandbox Code Playgroud) c# ×6
excel ×5
.net ×4
com ×4
.net-4.0 ×1
ado.net ×1
com-interop ×1
destructor ×1
docx ×1
finalizer ×1
interop ×1
ms-word ×1
pia ×1
powerpoint ×1
release ×1
sql ×1
sql-server ×1
vb.net ×1
winforms ×1