简体   繁体   English

C#“未处理COMException”

[英]C# “COMException was unhandled”

VS is showing me an error when I run my program, it starts fine and the datagrid is populated with info from my Access DB file, but when the DoWork button is triggered i'm seeing the following error on line 37 ws.Cells[1, 0] = "Act"; VS在运行程序时向我显示错误,它可以正常运行,并且用Access DB文件中的信息填充了数据网格,但是当触发DoWork按钮时,我在第37行ws.Cells[1, 0] = "Act";上看到以下错误ws.Cells[1, 0] = "Act";

An exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll but was not handled in user code mscorlib.dll中发生类型'System.Runtime.InteropServices.COMException'的异常,但未在用户代码中处理

 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)
        {

        }
    }
}

It seems, that this error because excel has non-zero based row and column numbering. 似乎此错误是因为excel具有基于非零的行和列编号。 You need to change 你需要改变

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

as

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

And change the numeration of other cells. 并更改其他单元格的数量。

I have not actually find it (non-zero numbering) at official documentation, so this is only based on my experience of working with excel. 我在官方文档中实际上没有找到它(非零编号),所以这仅基于我使用excel的经验。

Related answer on SuperUser - Which Excel objects are zero-based and which are one-based? 有关SuperUser的相关答案- 哪些Excel对象是基于零的对象,哪些是基于1的对象?

Collections - 1-based index 馆藏-从1开始的索引
... ...
Excel collections: Workbooks, Sheets, Ranges, Shapes Excel集合:工作簿,图纸,范围,形状

ws.Cells returns the Range object. ws.Cells返回Range对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM