在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

public class Invoker
    {
        public SaveFileDialog InvokeDialog;
        private Thread InvokeThread;
        private DialogResult InvokeResult;

        public Invoker()
        {
            InvokeDialog = new SaveFileDialog();
            InvokeThread = new Thread(new ThreadStart(InvokeMethod));
            InvokeThread.SetApartmentState(ApartmentState.STA);
            InvokeResult = DialogResult.None;
        }

        public DialogResult Invoke()
        {
            InvokeThread.Start();
            InvokeThread.Join();
            return InvokeResult;
        }

        private void InvokeMethod()
        {
            InvokeResult = InvokeDialog.ShowDialog();
        }
    }

 

private void ExportExcel(SAPbouiCOM.Matrix ma)
        {
            int count = 0;
            List<int> list = new List<int>();
            for (int r = 0; r < ma.RowCount; r++)
            {
                SAPbouiCOM.CheckBox chkChoose = (SAPbouiCOM.CheckBox)ma.Columns.Item("Choose").Cells.Item(r + 1).Specific;
                if (chkChoose.Checked == true)
                {
                    list.Add(r);
                    count ++;
                }
            }
            if (count == 0)
            {
                MessageBoxFrame("请选择一项!", 3, "OK", "", "", true);
                return;
            }
            string saveFileName = "";
            Invoker inv = new Invoker();

            inv.InvokeDialog.DefaultExt = "xls";
            inv.InvokeDialog.Filter = "Excel文件|*.xls";
            inv.Invoke();
            saveFileName = inv.InvokeDialog.FileName;

            System.Reflection.Missing miss = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
            excel.Application.Workbooks.Add(true); ;
            excel.Visible = false;//若是true,则在导出的时候会显示EXcel界面。
            if (excel == null)
            {
                MessageBoxFrame("EXCEL无法启动!", 3, "OK", "", "", true);
                return;
            }
            Microsoft.Office.Interop.Excel.Workbooks books = (Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook book = (Microsoft.Office.Interop.Excel.Workbook)(books.Add(miss));
            Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;

            //写入标题
            for (int i = 0; i < ma.Columns.Count - 2; i++)
            {
                excel.Cells[1, i + 1] = ma.Columns.Item(i + 2).Title;
            }
            //写入数值
            for (int r = 0; r < list.Count; r++)
            {
                for (int i = 0; i < ma.Columns.Count - 2; i++)
                {
                    excel.Cells[r + 2, i + 1] = ((SAPbouiCOM.EditText)ma.Columns.Item(i + 2).Cells.Item(list[r] + 1).Specific).Value;
                }
            }
            excel.Columns.EntireColumn.AutoFit();//列宽自适应
            if (inv.InvokeResult==DialogResult.Cancel)
            {
                return;
            }
            if (saveFileName == "")
            {
                MessageBoxFrame("请输入文件名!", 3, "OK", "", "", true);
                return;
            }
            try
            {
                sheet.SaveAs(saveFileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
            }
            catch (Exception ex)
            {
                MessageBoxFrame(ex.ToString(), 3, "OK", "", "", true);
                return;
            }
            book.Close(false, miss, miss);
            books.Close();
            excel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

            GC.Collect();
            MessageBoxFrame("数据导出成功!", 3, "OK", "", "", true);
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值