C#" COMException未处理"

时间:2017-03-20 04:44:49

标签: c#

当我运行我的程序时,VS显示错误,它启动正常,数据网格填充了我的Access数据库文件中的信息,但是当触发DoWork按钮时,我在第37行看到以下错误ws.Cells[1, 0] = "Act";

  

类型' System.Runtime.InteropServices.COMException'的例外情况   发生在mscorlib.dll中但未在用户代码中处理

Additional information: Exception from HRESULT: 0x800A03EC


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Threading;
using System.Data.OleDb;

namespace DataExporter
{
    public partial class Form1 : Form
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //List<Product> list = ((DataParameter)e.Argument).ProductList;
            System.Data.DataTable list = ((DataParameter)e.Argument).ProductList;
            string filename = ((DataParameter)e.Argument).FileName;
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet);
            Worksheet ws = (Worksheet)excel.ActiveSheet;
            excel.Visible = false;
            int index = 1;
            //int process = list.Count;
            int process = list.Rows.Count;
            //Add Column
            ws.Cells[1, 0] = "Act";
            ws.Cells[1, 1] = "ProductID";
            ws.Cells[1, 2] = "ProductKey";
            ws.Cells[1, 3] = "AllowInternetOrder";
            ws.Cells[1, 4] = "AllowPhoneOrder";
            ws.Cells[1, 5] = "AllowProductReview";
            ws.Cells[1, 6] = "AvailabilityRule";
            ws.Cells[1, 7] = "BuyingGuide";
            ws.Cells[1, 8] = "BuyingGuideName";
            ws.Cells[1, 9] = "CreateDate";
            ws.Cells[1, 10] = "DisplayOrder";
            ws.Cells[1, 11] = "DisplayTemplate";
            ws.Cells[1, 12] = "DynamicFormCode";
            ws.Cells[1, 13] = "Extension";
            ws.Cells[1, 14] = "FAQ";
            ws.Cells[1, 15] = "FAQName";
            ws.Cells[1, 16] = "Featured";
            ws.Cells[1, 17] = "MetaDescription";
            ws.Cells[1, 18] = "MetaKeywords";
            ws.Cells[1, 19] = "Name";
            ws.Cells[1, 20] = "Overview";
            ws.Cells[1, 21] = "OverviewName";
            ws.Cells[1, 22] = "PageTitle";
            ws.Cells[1, 23] = "ProductDetailUrl";
            ws.Cells[1, 24] = "ProductType";
            ws.Cells[1, 25] = "Published";
            ws.Cells[1, 26] = "RedirectUrl";
            ws.Cells[1, 27] = "SellerID";
            ws.Cells[1, 28] = "ShowAddToCart";
            ws.Cells[1, 29] = "ShowAddToWishList";
            ws.Cells[1, 30] = "ShowBuyNow";
            ws.Cells[1, 31] = "ShowInventory";
            ws.Cells[1, 32] = "ShowMSRP";
            ws.Cells[1, 33] = "ShowPrice";
            ws.Cells[1, 34] = "ShowQuantity";
            ws.Cells[1, 35] = "ShowRewardPoints";
            ws.Cells[1, 36] = "ShowSavings";
            ws.Cells[1, 37] = "ShowSeeDetails";
            ws.Cells[1, 38] = "ShowSKU";
            ws.Cells[1, 39] = "ShowSocialShare";
            ws.Cells[1, 40] = "ShowUpdate";
            ws.Cells[1, 41] = "Specifications";
            ws.Cells[1, 42] = "SpecificationsName";
            ws.Cells[1, 43] = "StartDate";
            ws.Cells[1, 44] = "StopDate";
            ws.Cells[1, 45] = "Summary";
            ws.Cells[1, 46] = "Terms";
            ws.Cells[1, 47] = "TermsName";
            ws.Cells[1, 48] = "UpdateDate";
            ws.Cells[1, 49] = "UrlName";
            foreach (DataRow dr in list.Rows)
            {
                if (!backgroundWorker.CancellationPending)
                {
                    backgroundWorker.ReportProgress(index++ * 100 / process);
                    ws.Cells[index, 0] = dr.ItemArray[0].ToString();
                    ws.Cells[index, 1] = dr.ItemArray[1].ToString();
                    ws.Cells[index, 2] = dr.ItemArray[2].ToString();
                    ws.Cells[index, 3] = dr.ItemArray[3].ToString();
                    ws.Cells[index, 4] = dr.ItemArray[4].ToString();
                    ws.Cells[index, 5] = dr.ItemArray[5].ToString();
                    ws.Cells[index, 6] = dr.ItemArray[6].ToString();
                    ws.Cells[index, 7] = dr.ItemArray[7].ToString();
                    ws.Cells[index, 8] = dr.ItemArray[8].ToString();
                    ws.Cells[index, 9] = dr.ItemArray[9].ToString();
                    ws.Cells[index, 10] = dr.ItemArray[10].ToString();
                    ws.Cells[index, 11] = dr.ItemArray[11].ToString();
                    ws.Cells[index, 12] = dr.ItemArray[12].ToString();
                    ws.Cells[index, 13] = dr.ItemArray[13].ToString();
                    ws.Cells[index, 14] = dr.ItemArray[14].ToString();
                    ws.Cells[index, 15] = dr.ItemArray[15].ToString();
                    ws.Cells[index, 16] = dr.ItemArray[16].ToString();
                    ws.Cells[index, 17] = dr.ItemArray[17].ToString();
                    ws.Cells[index, 18] = dr.ItemArray[18].ToString();
                    ws.Cells[index, 19] = dr.ItemArray[19].ToString();
                    ws.Cells[index, 20] = dr.ItemArray[20].ToString();
                    ws.Cells[index, 21] = dr.ItemArray[21].ToString();
                    ws.Cells[index, 22] = dr.ItemArray[22].ToString();
                    ws.Cells[index, 23] = dr.ItemArray[23].ToString();
                    ws.Cells[index, 24] = dr.ItemArray[24].ToString();
                    ws.Cells[index, 25] = dr.ItemArray[25].ToString();
                    ws.Cells[index, 26] = dr.ItemArray[26].ToString();
                    ws.Cells[index, 27] = dr.ItemArray[27].ToString();
                    ws.Cells[index, 28] = dr.ItemArray[28].ToString();
                    ws.Cells[index, 29] = dr.ItemArray[29].ToString();
                    ws.Cells[index, 30] = dr.ItemArray[30].ToString();
                    ws.Cells[index, 31] = dr.ItemArray[31].ToString();
                    ws.Cells[index, 32] = dr.ItemArray[32].ToString();
                    ws.Cells[index, 33] = dr.ItemArray[33].ToString();
                    ws.Cells[index, 34] = dr.ItemArray[34].ToString();
                    ws.Cells[index, 35] = dr.ItemArray[35].ToString();
                    ws.Cells[index, 36] = dr.ItemArray[36].ToString();
                    ws.Cells[index, 37] = dr.ItemArray[37].ToString();
                    ws.Cells[index, 38] = dr.ItemArray[38].ToString();
                    ws.Cells[index, 39] = dr.ItemArray[39].ToString();
                    ws.Cells[index, 40] = dr.ItemArray[40].ToString();
                    ws.Cells[index, 41] = dr.ItemArray[41].ToString();
                    ws.Cells[index, 42] = dr.ItemArray[42].ToString();
                    ws.Cells[index, 43] = dr.ItemArray[43].ToString();
                    ws.Cells[index, 44] = dr.ItemArray[44].ToString();
                    ws.Cells[index, 45] = dr.ItemArray[45].ToString();
                    ws.Cells[index, 46] = dr.ItemArray[46].ToString();
                    ws.Cells[index, 47] = dr.ItemArray[47].ToString();
                    ws.Cells[index, 48] = dr.ItemArray[48].ToString();
                    ws.Cells[index, 49] = dr.ItemArray[49].ToString();
                }
            }
            //Save file
            ws.SaveAs(filename, XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
            excel.Quit();
        }

        struct DataParameter
        {
            public System.Data.DataTable ProductList;
            public string FileName { get; set; }
        }

        DataParameter _inputParameter;

        private void Form1_Load(object sender, EventArgs e)
        {
            string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MY_DB_Name.accdb";
            using (OleDbConnection olcon = new OleDbConnection(ConnectionString))
            {
                using (OleDbDataAdapter adapter = new OleDbDataAdapter())
                {

                    string command = "MY ACCESS QUERY THAT PULLS 50 COLS HERE";
                    //cmd.CommandText = "SELECT * FROM [" + sheetName + "]";

                    OleDbCommand cmd = new OleDbCommand(command, olcon);
                    //Fill Gridview with Data from Access
                    try
                    {
                        dt.Clear();
                        adapter.SelectCommand = cmd;
                        adapter.Fill(dt);
                        dataGridView1.DataSource = dt;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    finally
                    {
                        olcon.Close();
                        var totalWidth = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.None);
                    }
                }
            }

        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
            lblStatus.Text = string.Format("Processing...{0}", e.ProgressPercentage);
            progressBar.Update();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                Thread.Sleep(100);
                lblStatus.Text = "Your data has been successfully exported.";
            }
        }
        private void btnExport_Click(object sender, EventArgs e)
        {
            if (backgroundWorker.IsBusy)
                return;
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls" })
            {
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    _inputParameter.FileName = sfd.FileName;
                    //_inputParameter.ProductList = GetProductsList2();
                    _inputParameter.ProductList = (System.Data.DataTable)dataGridView1.DataSource;
                    progressBar.Minimum = 0;
                    progressBar.Value = 0;
                    backgroundWorker.RunWorkerAsync(_inputParameter);
                }
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:1)

看来,这个错误因为excel具有非零的行和列编号。你需要改变

:INT

作为

ws.Cells[1, 0] = "Act";

并更改其他单元格的编号。

我在官方文档中实际上没有找到它(非零编号),所以这只是基于我使用excel的经验。

SuperUser上的相关答案 - Which Excel objects are zero-based and which are one-based?

  

收藏 - 基于1的索引
  ...
  Excel集合:   工作簿,表格,范围,形状

ws.Cells[1, 1] = "Act"; 会返回ws.Cells个对象。

相关问题