DataGridView导出excel 进程关闭

luluyy 2012-10-01 02:49:24
导出完成后 总有一个进程在任务栏里面,怎么也关不掉呢,导出的时候直接显示保存对话框保存的.

试了两种办法 第一种杀不掉,第二种全给我干掉了,本来我正用着EXCEL呢 不想关他也给杀掉了,
请问怎么弄

第一种

if(oBook != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook);
oBook = null;
if(oBooks != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks);
oBooks = null;
if(excel != null)
{
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (excel);
excel = null;
}
GC.Collect();


第二种:

2.private void KillProcess(string processName)
3.{
4. //
5. System.Diagnostics.Process myproc = new System.Diagnostics.Process();
6. //
7. try
8. {
9. //
10. foreach (Process thisproc in Process.GetProcessesByName(processName))
11. {
12.
13. thisproc.Kill();
14. }
15. }
16. catch (Exception Exc)
17. {
18. throw new Exception("", Exc);
19. }
20.}



我是不是哪里出划了,请指点或者给个例子 谢了
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之影子 2012-11-14
  • 打赏
  • 举报
回复
直接导出,不要打开,让用户自己打开。
烟灰洒落键盘 2012-11-14
  • 打赏
  • 举报
回复
        
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);       
 public void KillSpecialExcel(Excel.Application m_objExcel)
        {
            try
            {
                if (m_objExcel != null)
                {
                    int lpdwProcessId;
                    GetWindowThreadProcessId(new IntPtr(m_objExcel.Hwnd), out lpdwProcessId); System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
luluyy 2012-11-14
  • 打赏
  • 举报
回复
引用 1 楼 ggewt2td 的回复:
Automation进程通信存在一些问题,有时进程会失去控制,而且会导致一些莫名其妙的问题。 你可以换一种方式导出,比如用 xml格式,Excel支持xml格式, 你生成xml格式数据,用excel就可以打开了。 XML/HTML code?123456789101112131415161718192021222324252627282930313233……
试了一下好像不行
ggewt2td 2012-10-02
  • 打赏
  • 举报
回复
Automation进程通信存在一些问题,有时进程会失去控制,而且会导致一些莫名其妙的问题。

你可以换一种方式导出,比如用 xml格式,Excel支持xml格式,
你生成xml格式数据,用excel就可以打开了。



<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>User</Author>
<LastAuthor>User</LastAuthor>
<Created>2012-10-02T15:19:20Z</Created>
<Company>微软中国</Company>
<Version>11.5606</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>9225</WindowHeight>
<WindowWidth>18180</WindowWidth>
<WindowTopX>360</WindowTopX>
<WindowTopY>120</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Row>
<Cell><Data ss:Type="String">fsd</Data></Cell>
<Cell><Data ss:Type="String">fsdfs</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveCol>1</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet2">
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet3">
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
public void print(DataGridView dataGridView1) { //导出到execl try { //没有数据的话就不往下执行 if (dataGridView1.Rows.Count == 0) return; //实例化一个Excel.Application对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写 excel.Visible = false; //新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错 excel.Application.Workbooks.Add(true); //生成Excel中列头名称 for (int i = 0; i < dataGridView1.Columns.Count; i++) { excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText; } //把DataGridView当前页的数据保存在Excel中 for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { for (int j = 0; j < dataGridView1.Columns.Count; j++) { if (dataGridView1[j, i].ValueType == typeof(string)) { excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString(); } else { excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString(); } } } //设置禁止弹出保存和覆盖的询问提示框 excel.DisplayAlerts = false; excel.AlertBeforeOverwriting = false; //保存工作簿 excel.Application.Workbooks.Add(true).Save(); //保存excel文件 excel.Save("C:" + "\\KKHMD.xls"); //确保Excel进程关闭 excel.Quit(); excel = null; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示"); } }
DataGridView打印控件5.3版 窗口程序使用演示 包含多个打印控件在窗口程序使用的实例及源代码(有C#的,也有VB的),有源代码 打印控件 实际的打印控件(含.NET4.0的专用打印控件) 网页中使用演示 打印控件在网页中使用的演示程序(有源代码) 1、DGVPrint和VB2008Print 组件在分组打印时,可以在标题中打印当前组名(使用变量“$组名$”); 2、对DGVPrint组件的打印参数设置界面进行了重新排版,并去掉了说明页; 3、增加了DrawTitle和DrawTitleEx函数,方便打印标题行; 4、打印DGV表格时单元格的边距完全按DGV本身的设置进行打印(原来只能按DGV的DefaultCellStyle.Padding设置的大小打印); 5、DGVPrint组件增加了多个属性用于控制弹出的打印参数设置窗口中允许进行更改的项(请参数以EnableChange开头的属性,有9个); 6、解决在64位操作系统下无法弹出打印对话框的问题,去掉了打印处理进度窗口中的“.NET轻松打印控件”字样; 7、彻底解决了调用Excel后(导出excel文件)Excel进程关闭问题; 8、多表头组件MulHeaderDataGridView具有单元格内容合并显示功能; 9、新增DrawExpression函数,结合ExpressionDrawer类可以很方便对单变量表达式进行绘图打印 10、增加了网中使用的打印控件WebPrintServer的水印打印功能和装订线打印功能 11、增加了将报表文件(you结尾的文件)和报表模板生成的报表(用EasyReport组件的GetReportString方法得到的字符串)添加到VB2008Print组件的当前打印作业中的方法(详见AddReport和AddReportByString方法) 12、删除了PrintDataGrid函数(若要打印DataGrid,请先调用ConvertDataGridToDGV函数将DataGrid转换为DataGridView再以打印DGV的形式打印)和ChartGraph图表组件(图表打印请使用功能更强大且不依赖Excel的Chartlet图表组件) 13、其他一些完善,比如对DrawTextEx函数进行了完善,解决了有时出现“同一依赖程序集的不同版本之间出现冲突”警告的问题(如果出现,这个问题也并不影响程序的编译和运行,您不用太在意),如果电脑上未安装打印机驱动,程序会给出友好提示而不是像以前一样报错,对部分帮助文件内容进行了完善(如PrintDGV等函数)。 使用说明:只需要把dll引用到项目、添加打印事件 Private Sub Btn_Printer_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Printer.Click '调用打印 DgVprint1.Alignment = StringAlignment.Center '表格居中 DgVprint1.MainTitle = "监控系统报表记录打印" DgVprint1.SubTitle = "苏州市华工照明科技有限公司" DgVprint1.TableHeaderLeft = "编制单位:路灯管理所" DgVprint1.TableFooterLeft = "制表:苏州市华工照明科技有限公司" DgVprint1.PrintType = VBprinter.DGVprint.mytype.GeneralPrint '在此还可以设置其他属性,当然,也可以DGVPRINT1的悔改窗口中进行设置,效果完全一样的 DgVprint1.Print(Me.DataGridView, False) End Sub 以下为导出excel方法实例: Private Sub BtnToExcel_Click(sender As System.Object, e As System.EventArgs) Handles BtnToExcel.Click 'Dim To_Excel As New To_Excel(Me.DataGridView) '方法一:导出excel Dim ToExcel As New VBprinter.DGVprint '方法二:导出excel ToExcel.ExportDGVToExcel(Me.DataGridView) ToExcel.Dispose() End Sub

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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