web-dev-qa-db-ja.com

C#でXLSXからデータを読み取る

私はc#を初めて使用し、次のコードでc#のXLSXファイルを読み込もうとしています。

string Connection = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=c:\\Temp\\source.xlsx;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";";

//code to read the content of format file 
OleDbConnection con = new OleDbConnection(Connection);
OleDbCommand command = new OleDbCommand();

DataTable dt = new DataTable();
OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [Tabelle1$]", con);

myCommand.Fill(dt);
Console.Write(dt.Rows.Count);

出力から正しいカウントが得られますが、さらに2つの質問があります。

1. select whereステートメントを作成する方法(行にアクセスする方法)?

 select * from [Tabelle1$] where A = '123' (A being an existing Excel row)

間違ったパラメータに言及しているエラーをスローします...

2.チュートリアルリンクまたはデータへのアクセス方法の短いサンプルを誰かに提供できますか?

17
RRZ Europe

次のサンプルコードを参照してください。

private DataTable LoadXLS(string strFile, String sheetName, String column, String value)
{
    DataTable dtXLS = new DataTable(sheetName);

    try
    {
       string strConnectionString = "";

       if(strFile.Trim().EndsWith(".xlsx")) {

           strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", strFile);

       } else if(strFile.Trim().EndsWith(".xls")) {

           strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", strFile);

       }

       OleDbConnection SQLConn = new OleDbConnection(strConnectionString);

       SQLConn.Open();

       OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();

       string sql = "SELECT * FROM [" + sheetName + "$] WHERE " + column + " = " + value;

       OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);

       SQLAdapter.SelectCommand = selectCMD;

       SQLAdapter.Fill(dtXLS);

       SQLConn.Close();
    }

    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
    }

    return dtXLS;

}
19

個人的には、OleDbConnectionsでExcelスプレッドシートを読むのは扱いにくいことに気づきました。したがって、私は素晴らしいオープンソース&無料 ExcelMapperの代替案を提供したいと思います。

OLEクエリと比較して、Excelファイルを読み取るためのより簡潔な(つまり、読み取り可能な)方法を提供します。

1。 Excelファイルがある場合

enter image description here

2.Person C#オブジェクトを作成します:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

3.ExcelMapperを使用して読み取ります

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>();

追加のシート引数を渡すだけで、他のワークシートから読み取ることもできます。

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>("Sheet2");

NuGetを使用してインストールできます

Install-Package ExcelMapper

免責事項:私はExcelMapperに関連付けられていませんが、さまざまな異なるライブラリを試した後、このライブラリが最も扱いやすいとわかりました。

Reg: "2.誰でも私にチュートリアルリンクまたはデータへのアクセス方法の短いサンプルを提供できます"

上記は短い video です。

instructional video - how to read Excel files in c#

私はこれが古い質問であることを知っていますが、このページは "import xlsx c#"に関するGoogleの結果で高く評価されたため、NPOIライブラリを使用してxls/xlsxデータを読み取る、よりモダンでシンプルな方法を追加したいと考えました。新しいc#開発者に、ado.netを使用するよりもExcelデータをインポートする方が簡単な方法があることを知ってもらいたいと思います。

NPOIとNpoi.Mapper(donnytianから: https://github.com/donnytian/Npoi.Mapper )の組み合わせを使用して、Excelファイルを簡単にインポートします。 NPOIおよびNpoi.Mapperへのnuget参照を追加すると、インポートする列に直接相関する強く型付けされたクラスを使用して、xls/xlsxデータをインポートできます。

`` `System.IOを使用; System.Linqを使用します。 Npoi.Mapperを使用します。 Npoi.Mapper.Attributesを使用します。 NPOI.SS.UserModelを使用します。 UserManagementService.Modelsを使用します。

名前空間JobCustomerImport.Processors {パブリッククラスExcelEmailProcessor {プライベートUserManagementServiceContext DataContext {取得; }

    public ExcelEmailProcessor(int customerNumber)
    {
        DataContext = new UserManagementServiceContext();
    }

    public void Execute(string localPath, int sheetIndex)
    {
        IWorkbook workbook;
        using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
        {
            workbook = WorkbookFactory.Create(file);
        }

        var importer = new Mapper(workbook);
        var items = importer.Take<MurphyExcelFormat>(sheetIndex);
        foreach(var item in items)
        {
            var row = item.Value;
            if (string.IsNullOrEmpty(row.EmailAddress))
                continue;

            UpdateUser(row);
        }

        DataContext.SaveChanges();
    }

    private void UpdateUser(MurphyExcelFormat row)
    {
        //LOGIC HERE TO UPDATE A USER IN DATABASE...
    }

    private class MurphyExcelFormat
    {
        [Column("District")]
        public int District { get; set; }

        [Column("DM")]
        public string FullName { get; set; }

        [Column("Email Address")]
        public string EmailAddress { get; set; }

        [Column(3)]
        public string Username { get; set; }

        public string FirstName
        {
            get
            {
                return Username.Split('.')[0];
            }
        }

        public string LastName
        {
            get
            {
                return Username.Split('.')[1];
            }
        }
    }
}

} `` `

興味があれば、ブログの細かい点をいくつか取り上げました。 Excelファイルを簡単にインポートする方法

ありがとう!ダン

0
Dan