C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

エクセルに書込み

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■103148 / inTopicNo.1)  エクセルに書込み
  
□投稿者/ screen (1回)-(2024/05/29(Wed) 15:19:44)

分類:[.NET 全般] 

Windows フォームアプリケーション.NetFramework c#
Windows10  Office2019

今datagridviewで表を画面に表示していまして
btnWriteボタンでG.folderPathの中にあるエクセルに対して
書込みに行っています

private void btnWrite_Click(object sender, EventArgs e)
        {

            int totalRows = dataGridView1.Rows.Count - 1; 
            int processedRows = 0;

            if (totalRows < 0)
            {
                totalRows = 0; 
            }

            Excel.Application excelApp = new Excel.Application();

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.IsNewRow) continue;

                if (row.Cells[23].Value?.ToString() == "〇")
                {
                    try
                    {
                        string filePath = row.Cells[26].Value.ToString();
                        int lineNumber = Convert.ToInt32(row.Cells[27].Value);

                        ProcessRow(excelApp, row, filePath, lineNumber);
                        processedRows++;

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show($"エラーが発生しました: {ex.Message}");
                    }
                }
            }

            excelApp.Quit();
            ReleaseObject(excelApp);

        }

        private void ProcessRow(Excel.Application excelApp, DataGridViewRow row, string filePath, int lineNumber)
        {
            Excel.Workbook workbook = excelApp.Workbooks.Open(filePath);
            Excel.Worksheet worksheet = workbook.Sheets[1];

            WriteCellData(row, worksheet, lineNumber, 6, "M/d", 3.5);
            WriteCellData(row, worksheet, lineNumber, 7);

            if (chkHand.Checked)
            {
                for (int columnIndex = 8; columnIndex <= 23; columnIndex++)
                {
                    WriteCellData(row, worksheet, lineNumber, columnIndex);
                }
            }
            else
            {
                for (int columnIndex = 8; columnIndex <= 23; columnIndex++)
                {
                    worksheet.Cells[lineNumber, columnIndex + 1].Value = row.Cells[columnIndex].Value;
                }
            }

            WriteCellData(row, worksheet, lineNumber, 24, "M/d", 3.5);
            WriteCellData(row, worksheet, lineNumber, 25);

            workbook.Save();
            workbook.Close(false);
            ReleaseObject(workbook);
            ReleaseObject(worksheet);
        }

        private void WriteCellData(DataGridViewRow row, Excel.Worksheet worksheet, int lineNumber, int columnIndex, string numberFormat = null, double? columnWidth = null)
        {
            object cellValue = row.Cells[columnIndex].Value;
            var cell = worksheet.Cells[lineNumber, columnIndex + 1];

            cell.Font.Size = 6;
            cell.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

            if (numberFormat != null)
            {
                cell.NumberFormat = numberFormat;
            }
            if (columnWidth.HasValue)
            {
                cell.ColumnWidth = columnWidth.Value;
            }

            cell.Value = cellValue;
        }

        private void ReleaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show("COMオブジェクトの解放中にエラーが発生しました: " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }



それを違う人のパソコンで動作確認しようと思ったらエラーが発生しました
その人のパソコンはWindows11 でOffice365を使っています

エラーの内容が下記になります

"エラーが発生しました:型’Microsoft.Office.Interrop.Excel.ApplicationClass'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interrop.Excel._Application'にキャストできません。IID'{000208D5-0000-0000-C000-000000000046}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、この操作に失敗しました:インターフェイスが登録されていません(HRESULTからの例外:0x80040155)。


これはOffice365を使用しているからでしょうか
教えて下さい。宜しくお願い致します

引用返信 編集キー/
■103149 / inTopicNo.2)  Re[1]: エクセルに書込み
□投稿者/ WebSurfer (2901回)-(2024/05/29(Wed) 15:42:52)
No103148 (screen さん) に返信
> Windows フォームアプリケーション.NetFramework c#
> Windows10 Office2019
>
> 今datagridviewで表を画面に表示していまして
> btnWriteボタンでG.folderPathの中にあるエクセルに対して
> 書込みに行っています

excel に代えて csv でも良ければ以下の記事が参考になると思います。

CSV ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx
引用返信 編集キー/
■103150 / inTopicNo.3)  Re[1]: エクセルに書込み
□投稿者/ KOZ (448回)-(2024/05/29(Wed) 15:50:36)
No103148 (screen さん) に返信
> "エラーが発生しました:型’Microsoft.Office.Interrop.Excel.ApplicationClass'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interrop.Excel._Application'にキャストできません。IID'{000208D5-0000-0000-C000-000000000046}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、この操作に失敗しました:インターフェイスが登録されていません(HRESULTからの例外:0x80040155)。

「インターフェイスが登録されていません」ということなので
デスクトップ版の Office でなく、ストアアプリ版がインストールされているのかもしれません。
ClosedXML などのライブラリを使って出力するようにしたほうがいいのではないでしょうか。
引用返信 編集キー/
■103157 / inTopicNo.4)  Re[2]: エクセルに書込み
□投稿者/ screen (2回)-(2024/05/31(Fri) 08:22:51)
No103150 (KOZ さん) に返信
> ■No103148 (screen さん) に返信
>>"エラーが発生しました:型’Microsoft.Office.Interrop.Excel.ApplicationClass'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interrop.Excel._Application'にキャストできません。IID'{000208D5-0000-0000-C000-000000000046}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、この操作に失敗しました:インターフェイスが登録されていません(HRESULTからの例外:0x80040155)。
>
> 「インターフェイスが登録されていません」ということなので
> デスクトップ版の Office でなく、ストアアプリ版がインストールされているのかもしれません。
> ClosedXML などのライブラリを使って出力するようにしたほうがいいのではないでしょうか。


ありがとうございます
やってみます
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ