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

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

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

Re[2]: c#でエクセル内容読出し


(過去ログ 177 を表示中)

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

■101893 / inTopicNo.1)  c#でエクセル内容読出し
  
□投稿者/ 元気 (1回)-(2023/05/10(Wed) 18:18:48)

分類:[.NET 全般] 

環境はc# windows フォームアプリケーション.Net Frameworkです

宜しくお願い致します
エクセルの商品と言うブックを開き、A列を上から見て行って
検索する文字と一致する行のB列とC列のデータを配列に入れたいと
思っています

調べながらコードを書いたのですが using (ExcelPackage....の所で
CS1674 暗黙的に 'System.IDisposable' に変換できる必要があります
とでるのですが、よくわかりませんので教えて頂けないでしょうか
宜しくお願い致します



using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using OfficeOpenXml;

namespace WindowsFormsApp720
{
    public partial class Form1 : Form
    {
        static void Main()
        {
            string filePath = @"c:\DATA1\商品.xlsx";
            string searchString = "ペン";

            string[,] matchingData = SearchInExcel(filePath, searchString);
            Console.WriteLine("合致する結果:");
            int rowCount = matchingData.GetLength(0);
            for (int row = 0; row < rowCount; row++)
            {
                string bValue = matchingData[row, 0];
                string cValue = matchingData[row, 1];
                Console.WriteLine("B列の値: " + bValue);
                Console.WriteLine("C列の値: " + cValue);
            }
        }

        static string[,] SearchInExcel(string filePath, string searchString)
        {
            List<string[]> matchingData = new List<string[]>();

            using (ExcelPackage Package = new ExcelPackage(new FileInfo(filePath)))
            {
                ExcelWorksheet worksheet = Package.Workbook.Worksheets[0]; 
                int rowCount = worksheet.Dimension.Rows;
                int columnCount = 2; 

                for (int row = 1; row <= rowCount; row++)
                {
                    string cellValue = worksheet.Cells[row, 1].Value?.ToString();
                    if (cellValue != null && cellValue.Equals(searchString, StringComparison.OrdinalIgnoreCase))
                    {
                        string[] rowData = new string[columnCount];
                        rowData[0] = worksheet.Cells[row, 2].Value?.ToString(); 
                        rowData[1] = worksheet.Cells[row, 3].Value?.ToString(); 
                        matchingData.Add(rowData);
                    }
                }
            }

            int matchingRowCount = matchingData.Count;
            string[,] result = new string[matchingRowCount, 2]; 

            for (int i = 0; i < matchingRowCount; i++)
            {
                result[i, 0] = matchingData[i][0]; 
                result[i, 1] = matchingData[i][1]; 
            }
            return result;
        }
    }
}

引用返信 編集キー/
■101894 / inTopicNo.2)  Re[1]: c#でエクセル内容読出し
□投稿者/ 魔界の仮面弁士 (3632回)-(2023/05/10(Wed) 20:24:05)
No101893 (元気 さん) に返信
> 環境はc# windows フォームアプリケーション.Net Frameworkです

Excel の読み取りに何を使っていますか? OpenOffice SDK? EPPlus?
それらのライブラリの、どのバージョンをお使いですか?
(たとえば EPPlus の場合、ver4 系はLGPLライセンスだが ver5 や ver6 はPolyform ライセンス)


> 調べながらコードを書いたのですが using (ExcelPackage....の所で
> CS1674 暗黙的に 'System.IDisposable' に変換できる必要があります
> とでるのですが、よくわかりませんので教えて頂けないでしょうか

たとえば EPPlus の ExcelPackage は IDisposable なので using できるはずですが、
実はプロジェクト内に ExcelPackage という同名のクラスが競合していて、
そちらは using 非対応だった…というケースとか。

その場合は、new ExcelPackage(…) の代わりに、new OfficeOpenXml.ExcelPackage(…) のように、
単純名ではなく完全修飾名で指定するという手があります。
引用返信 編集キー/
■101895 / inTopicNo.3)  Re[2]: c#でエクセル内容読出し
□投稿者/ 魔界の仮面弁士 (3633回)-(2023/05/11(Thu) 10:23:39)
No101894 (魔界の仮面弁士) に追記
>>環境はc# windows フォームアプリケーション.Net Frameworkです

そもそもなのですが、なぜ Form1 内に static void Main を書いて、
さらにその中で Console クラスを利用しているのでしょうか?

Console 処理が目的なのであれば、Windows Form アプリケーションではなく
コンソール アプリケーションとして開発するべきですし、Form1 内に
Main メソッドを書くと、エントリポイントの競合を起こしかねないかと。
https://smdn.jp/programming/dotnet-samplecodes/process/d73241a128ca11eb9ed5531d2d48dc2e/

Program.cs を削除して、Main という名のメソッドを Form1.Main に記述しているのかもしれませんが、
その Main メソッドでは Form1 を一切利用していないので、Form1 の存在意義がものすごく謎です。
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -