C# winform实现异步导出功能

来源:互联网 发布:擎洲广达软件价格 编辑:程序博客网 时间:2024/05/22 13:20
 #region 数据导出-异步        string strName = string.Empty;        private void btnExprot_Click(object sender, EventArgs e)        {            if (dt == null)            {                MessageBox.Show("没有可导出的数据");            }            else            {                try                {                    if (dt.Rows.Count < 1)                    {                        if (MessageBox.Show("确定要输出当前画面数据?", "消息内容", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)                        {                            dt = (DataTable)gvXML.DataSource;                        }                        else                        {                            return;                        }                    }                    SaveFileDialog save = new SaveFileDialog();                    save.Filter = "(*.xls)|*.xls";                    save.FilterIndex = 0;                    if (save.ShowDialog() == DialogResult.OK)                    {                        save.RestoreDirectory = true;                        save.Title = cbColumn.SelectedItem as string + "表的重复数据";                        strName = save.FileName;                        Query_Export();                    }                }                catch (Exception ex)                {                    MessageBox.Show(ex.ToString());                }            }        }        private AsyncCallback Async_Export = null;        private delegate DataTable DataTableExport(DataTable dst);        public void Query_Export()        {            Async_Export = new AsyncCallback(CallBack);            DataTableExport dtExport = new DataTableExport(GetDataTable);            dtExport.BeginInvoke((DataTable)this.gvXML.DataSource, Async_Export, dtExport);        }        private DataTable GetDataTable(DataTable dst)        {            return (DataTable)this.gvXML.DataSource;        }        public void CallBack(IAsyncResult result)        {            DataTableExport dtBindExport = (DataTableExport)result.AsyncState;            DataTable dtExport = dtBindExport.EndInvoke(result);            Missing miss = Missing.Value;            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();            if (excel == null)            {                MessageBox.Show("无法创建Excel对象,可能您的计算机未安装Excel");            }            else            {                #region 导出                Microsoft.Office.Interop.Excel.Workbooks books = excel.Workbooks;                Microsoft.Office.Interop.Excel.Workbook book = books.Add(miss);                Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;                //sheet.Name = cbColumn.SelectedItem as string;                int collndex = 0; int rowIndex = 1;                foreach (DataColumn col in dtExport.Columns)                {                    collndex++;                    excel.Cells[1, collndex] = col.ColumnName;                }                foreach (DataRow row in dtExport.Rows)                {                    rowIndex++;                    collndex = 0;                    foreach (DataColumn col in dtExport.Columns)                    {                        collndex++;                        excel.Cells[rowIndex, collndex] = row[col.ColumnName].ToString();                        excel.get_Range((object)excel.Cells[1, collndex], (object)excel.Cells[1, collndex]).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;                        excel.get_Range((object)excel.Cells[rowIndex, collndex], (object)excel.Cells[rowIndex, collndex]).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;                    }                }                sheet.SaveAs(strName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);                book.Close(true, miss, miss);                books.Close();                excel.Quit();                #endregion                MessageBox.Show("导出成功!");            }        }        #endregion
0 0