关于excel的奇怪问题,各位救救我吧,做不出来公司不何我签约的~~~~~~~~~~

gngnandgngn 2005-01-24 12:21:20
我执行了一段写excel 地代码后,会产生很奇怪的问题,进程中会有一个excel.exe的进程,不能强行停止,然后我也不能再访问excel了,包括手动打开excel都不行,会提示****内存不能访问什么地,只有重启才能杀掉那个excel进程。各位能指点一下吗,我不知道问题处在哪里,代码如下:
Excel.Application myexcel=new Excel.Application();
object temp=Missing.Value;
myexcel.Workbooks.Open("myexcel.xls",temp,temp,temp,temp,temp,temp,temp,temp,temp,temp,temp,temp);
myexcel.Cells[1,4]="a";
myexcel.Visible=false;
myexcel.Workbooks.Close();

谢谢了,我实在没分了,各位做做善事吧,项目赶不出转不了正地~~~~~~~~~~
...全文
143 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2005-01-24
  • 打赏
  • 举报
回复
虽然不建议杀进程,但是Quit()之后,进程里仍然会有EXCEL.EXE存在啊,如果多次重复操作之后,进程里就会有很多EXCEL了。杀它也是莫办法啊。
机器人 2005-01-24
  • 打赏
  • 举报
回复
C#:
public bool CloseExcelApp()
{
xlApp.Visible = true; // xlApp is the excel application.
try
{
if(xlApp != null && ! isRunning ) // isRunning是判断xlApp是怎么启动的flag.
{
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
//释放COM组件,其实就是将其引用计数减1
System.Diagnostics.Process theProc;
foreach( theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
{
//先关闭图形窗口。如果关闭失败...有的时候在状态里看不到图形窗口的excel了,
//但是在进程里仍然有EXCEL.EXE的进程存在,那么就需要杀掉它:p
if( theProc.CloseMainWindow() == false )
{
theProc.Kill();
}
}
xlApp = null;
return true;
}
}
Catch( Exception )
{
return false;
}


}
smx717616 2005-01-24
  • 打赏
  • 举报
回复
myexcel.Visible=false;? 为什么这样?
而不是?
myexcel.quit


还有不建议杀进程。

smx717616 2005-01-24
  • 打赏
  • 举报
回复
GC.Collect()
机器人 2005-01-24
  • 打赏
  • 举报
回复
没遇到这种情况哦,我操作excel的时候,先判断进程里是否启动了excel.如果有,就利用启动了的excel.如果没有才自己启动。还有你的代码:myexcel.Visible=false;让excel窗体不可见了,以后就算打开excel也看不见啊。在关闭workbook的以后,应该还原excel状态,并释放所有COM组件。关闭excel进程比较麻烦了,你可以参考下面的代码。

Public Function CloseExcelApp() As Boolean
'xlApp.WindowState = XlWindowState.xlMinimized
xlApp.Visble = true
Try
If Not xlApp Is Nothing And isRunningFlag = False Then
xlApp.Quit()
Marshal.ReleaseComObject(xlApp)

Dim theProc As System.Diagnostics.Process
For Each theProc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
If theProc.CloseMainWindow() = False Then
theProc.Kill()
End If
Next

End If
xlApp = Nothing
Return True
Catch ex As Exception
Return False
End Try
End Function

这是VB.Net的代码。
Oldman 2005-01-24
  • 打赏
  • 举报
回复
反过来做,如果在打开时已有Excel打开了,就关闭他,这样的话,就不会有太多的excel进程在系统里面。
yefanbin 2005-01-24
  • 打赏
  • 举报
回复
up
niss 2005-01-24
  • 打赏
  • 举报
回复
娃哈哈居然有两个▲了爽
niss 2005-01-24
  • 打赏
  • 举报
回复
这个偶也想知道!
老问题了,不知道是什么原因(微软官方从没说过有这种问题),难道只能归结为盗版的错?
gngnandgngn 2005-01-24
  • 打赏
  • 举报
回复
唉,还是不行啊,而且process.kill都不行了,提示access denied,而且出现很多奇怪问题。我晕啊,各位再提我想想办法 啊。
dahroswell 2005-01-24
  • 打赏
  • 举报
回复
我的这段代面处理没有你提的那个问题:
public void CreateExcel()
{
int rowIndex=4;//行起始坐标
int colIndex=1;//列起始坐标
ApplicationClass myApp=null;
Workbook myBook=null;
Worksheet mySheet=null;
//如果文件不存在,则将模板文件拷贝一份作为输出文件
//这里如果通过File.Create来创建文件是不行的,因为xls
//的空文件也有固定的格式,跟文本不一样的,也许有其它
//通过程序直接生成excel的方法
if(!File.Exists(m_outFilePath))
{
if((File.GetAttributes(m_inputFilePath) & FileAttributes.ReadOnly)==FileAttributes.ReadOnly)
{
File.SetAttributes(m_inputFilePath,FileAttributes.Archive);
}

File.Copy(m_inputFilePath,m_outFilePath,true);
}

if((File.GetAttributes(m_outFilePath) & FileAttributes.ReadOnly)==FileAttributes.ReadOnly)
{
File.SetAttributes(m_outFilePath,FileAttributes.Archive);
}
myApp= new ApplicationClass();
myApp.Visible=false;
object oMissiong=System.Reflection.Missing.Value;
myApp.Workbooks.Open(m_outFilePath,oMissiong,oMissiong,oMissiong,oMissiong,
oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);
myBook=myApp.Workbooks[1];
mySheet=(Worksheet)myBook.ActiveSheet;

//
//取得标题
//
foreach(DataColumn col in m_dv.Table.Columns)
{
colIndex++;
mySheet.Cells[4,colIndex] = col.ColumnName;
mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
//设置标题格式为居中对齐
}
//
//取得表格中的数据
//
foreach(DataRowView row in m_dv)
{
rowIndex ++;
colIndex = 1;
foreach(DataColumn col in m_dv.Table.Columns)
{
colIndex ++;
if(col.DataType == System.Type.GetType("System.DateTime"))
{
mySheet.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
}
else
if(col.DataType == System.Type.GetType("System.String"))
{
mySheet.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
}
else
{
mySheet.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
}
}
}
//
//加载一个合计行
//
int rowSum = rowIndex + 1;
int colSum = 2;
// mySheet.Cells[rowSum,2] = "合计";
// mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter;
//
//设置选中的部分的颜色
//
mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
//
//取得整个报表的标题
//
mySheet.Cells[2,2] = m_title;
//
//设置整个报表的标题格式
//
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Bold = true;
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Size = 22;
//
//设置报表表格为最适应宽度
//
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Columns.AutoFit();
//
//设置整个报表的标题为跨列居中
//
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection;
//
//绘制边框
//
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗
mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗
mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗
myBook.Save();
myBook.Close( true,m_outFilePath,true);
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);

GC.Collect();

}
gngnandgngn 2005-01-24
  • 打赏
  • 举报
回复
to fangxinggood: isRunning 是定义在哪个空间的阿,
vzxq 2005-01-24
  • 打赏
  • 举报
回复
up
webserv2 2005-01-24
  • 打赏
  • 举报
回复
发布一个操作Excel类库 功能 excel文件创建修改 单元格数据格式编辑 图片 图表 插入控制 外部数据的添加 插入等

下载地址:http://www.journeychina.com/OfficeEditor/

ExcelEditor提供以下方法:

'创建一个Excel对象
Public Sub Creat()

'打开一个Excel对象
Public Sub Open(ByVal FileName As String)
参数描述:FileName :excel文件路径

'获取一个工作表
Public Function GetSheet(ByVal SheetName As String) As Excel.Worksheet
参数描述:SheetName :工作表名称

'添加一个工作表
Public Function AddSheet(ByVal SheetName As String) As Excel.Worksheet

'删除一个工作表
Public Function DelSheet(ByVal SheetName As String)

'重命名一个工作表

Public Function ReNameSheet(ByVal OldSheetName As String, ByVal NewSheetName As String) As

Excel.Worksheet

Public Function ReNameSheet(ByVal Sheet As Excel.Worksheet, ByVal NewSheetName As String) As

Excel.Worksheet


'设置一个单元格的值

Public Sub SetCellValue(ByVal ws As Excel.Worksheet, ByVal x As Integer, ByVal y As Integer, ByVal

value As Object)

参数说明 ws:要设值的工作表 X行Y列 value 值
Public Sub SetCellValue(ByVal ws As String, ByVal x As Integer, ByVal y As Integer, ByVal value As

Object)


' 设置一个单元格的属性 字体, 大小,颜色 ,对齐方式

Public Sub SetCellProperty(ByVal ws As Excel.Worksheet, ByVal Startx As Integer, ByVal Starty As

Integer, ByVal Endx As Integer, ByVal Endy As Integer, ByVal size As Integer, Optional ByVal name As

String = "宋体", Optional ByVal color As Excel.Constants = Excel.Constants.xlAutomatic, Optional ByVal

HorizontalAlignment As Excel.Constants = Excel.Constants.xlLeft)


参数说明 :ws:要设值的工作表 Startx 起始单元格的行 Starty 起始单元格的列 Endx 结束单元格的行 Endy 结束

单元格的列 size 字体大小 name 字体 color 颜色 HorizontalAlignment 对齐方式

Public Sub SetCellProperty(ByVal wsn As String, ByVal Startx As Integer, ByVal Starty As Integer,

ByVal Endx As Integer, ByVal Endy As Integer, Optional ByVal size As Integer = 12, Optional ByVal name

As String = "宋体", Optional ByVal color As Excel.Constants = Excel.Constants.xlAutomatic, Optional

ByVal HorizontalAlignment As Excel.Constants = Excel.Constants.xlAutomatic.xlRight)


'合并单元格
Public Sub UniteCells(ByVal ws As Excel.Worksheet, ByVal Startx As Integer, ByVal Starty As Integer,

ByVal Endx As Integer, ByVal Endy As Integer)

参数说明 :ws:要设值的工作表 Startx 起始单元格的行 Starty 起始单元格的列 Endx 结束单元格的行 Endy 结束

单元格的列


'将内存中数据表格插入到Excel指定工作表的指定位置 为在使用摩板时控制格式时使用
Public Sub InsertTable(ByVal dt As Data.DataTable, ByVal ws As String, ByVal startX As Integer,

ByVal startY As Integer)

Public Sub InsertTable(ByVal dt As Data.DataTable, ByVal ws As Excel.Worksheet, ByVal startX As

Integer, ByVal startY As Integer)


'将内存中数据表格添加到Excel指定工作表的指定位置
Public Sub AddTable(ByVal dt As Data.DataTable, ByVal ws As String, ByVal startX As Integer, ByVal

startY As Integer)
Public Sub AddTable(ByVal dt As Data.DataTable, ByVal ws As Excel.Worksheet, ByVal startX As Integer,

ByVal startY As Integer)

'插入图片操作"
Sub InsertPictures(ByVal Filename As String, ByVal ws As String)

Sub InsertPictures(ByVal Filename As String, ByVal ws As String, ByVal Height As Integer, ByVal Width

As Integer)

Sub InsertPictures(ByVal Filename As String, ByVal ws As String, ByVal left As Integer, ByVal top As

Integer, ByVal Height As Integer, ByVal Width As Integer)


插入图表操作"
Public Sub InsertActiveChart(ByVal ChartType As Excel.XlChartType, ByVal ws As String, ByVal

DataSourcesX1 As Integer, ByVal DataSourcesY1 As Integer, ByVal DataSourcesX2 As Integer, ByVal

DataSourcesY2 As Integer, Optional ByVal ChartDataType As Excel.XlRowCol = Excel.XlRowCol.xlColumns)



参数说明 :ChartType 为图表类型 ws:要设值的工作表名 DataSourcesX1 图表数据源起始单元格的行

DataSourcesY1 图表数据源起始单元格的列 DataSourcesX2 图表数据源结束单元格的行 DataSourcesY2 图表数据源结

束单元格的列 ChartDataType 图表数据数据方式

' 保存文档
Public Function Save() As Boolean

' 文档另存为
Public Function SaveAs(ByVal FileName) As Boolean

' 关闭一个Excel对象,销毁对象
Public Sub Close()

这个一定要有!要不然 在系统进程中回有很EXCEL进程没有销毁!


使用方法:引用:VBExcelWordEditor.dll com引用: Microsoft Excel 10.0 Object Library


暂时只做了这些功能,慢慢扩展


62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧