代码之家  ›  专栏  ›  技术社区  ›  Matt

C#xls&xlsx查询从图纸中选择,而不考虑图纸名称

  •  0
  • Matt  · 技术社区  · 6 年前

    GetData 方法:

        private DataTable GetData(string userFileName)
        {
            string dirName = Path.GetDirectoryName(userFileName);
            string fileName = Path.GetFileName(userFileName);
            string fileExtension = Path.GetExtension(userFileName);
            string connection = string.Empty;
            string query = string.Empty;
    
            switch (fileExtension)
            {
                case ".xls":
                    connection = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={userFileName};" +
                                   "Extended Properties=\"Excel 8.0; HDR=Yes; IMEX=1\"";
                    query = "SELECT * FROM [Sheet1$]";
                    break;
    
                case ".xlsx":
                    connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={userFileName};" +
                                   "Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=1\"";
                    query = "SELECT * FROM [Sheet1$]";
                    break;
    
                case ".csv":
                    connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dirName};" +
                                   "Extended Properties=\"text; HDR=Yes; IMEX=1; FMT=Delimited\"";
                    query = $"SELECT * FROM [{fileName}]";
                    break;
            }
    
            return FillData(connection, query);
        }
    

    它适用于 .csv 文件,因为它使用文件名而不是图纸名。

    它适用于 .xls .xlsx 包含名为 Sheet1

    当我尝试使用 .xls/.xlsx

    System.Data.OleDb.OLEDBEException:“Sheet1$”不是有效名称。确保它不包含无效字符或标点符号,并且不太长。”

    另一个问题的答案是:

    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        conn.Open();
        dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME");
    }
    

    没有帮助,因为我不知道这应该放在我的代码中,答案中也没有任何关于这应该放在哪里的指示。

    我是这样加进去的吗?

    string Sheet1 = dataGridView1.Rows[0].Field<string>("TABLE_NAME");
    

    这给了我一个错误:

    2 回复  |  直到 6 年前
        1
  •  3
  •   Vladimir P.    6 年前

    FillData 方法在您的 GetData 方法,通过 query

        private DataTable GetDataFromFirstSheet(string connection)
        {
            using (OleDbConnection conn = new OleDbConnection(connection))
            {
                using (DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }))
                {
                    string firstSheet = dtSchema.Rows[0].Field<string>("TABLE_NAME");
    
                    //try to remove $ from sheetname if it will be not working
                    using (OleDbCommand cmd = new OleDbCommand($"SELECT * FROM [{firstSheet}$]", conn))
                    {
                        using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
                        {
                            conn.Open();
    
                            DataTable dt = new DataTable();
                            adp.Fill(dt);
    
                            return dt;
                        }                            
                    }
                }
            }
        }
    
        2
  •  3
  •   soulflyman    6 年前

    我很快为您的代码添加了一些修复程序,但这个解决方案还远远不够干净。 你应该考虑Wordimar的解决方案,深入了解代码。以下是一些优秀的资源: https://github.com/EbookFoundation/free-programming-books

    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        conn.Open();
        dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME");
    }
    

    之后,可以将收到的图纸名称插入查询中。

    快速而肮脏,您的代码将如下所示,以使其与xlsx文件一起工作:

    private static DataTable GetData(string userFileName)
        {
            string dirName = Path.GetDirectoryName(userFileName);
            string fileName = Path.GetFileName(userFileName);
            string fileExtension = Path.GetExtension(userFileName);
            string connection = string.Empty;
            string query = string.Empty;
    
            switch (fileExtension)
            {
                case ".xls":
                    connection = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={userFileName};" +
                                 "Extended Properties=\"Excel 8.0; HDR=Yes; IMEX=1\"";
                    query = "SELECT * FROM [Sheet1$]";
                    break;
    
                case ".xlsx":
                    connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={userFileName};" +
                                 "Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=1\"";
                    string sheetName;
                    using (OleDbConnection con = new OleDbConnection(connection))
                    {
                        con.Open();
                        var dtSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        sheetName = dtSchema.Rows[0].Field<string>("TABLE_NAME");
                    }
    
                    if (sheetName.Length <= 0) throw new InvalidDataException("No sheet found."); // abort if no sheet name was returned
    
                    query = $"SELECT * FROM [{sheetName}]";
                    break;
    
                case ".csv":
                    connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dirName};" +
                                 "Extended Properties=\"text; HDR=Yes; IMEX=1; FMT=Delimited\"";
                    query = $"SELECT * FROM [{fileName}]";
                    break;
            }
    
            return FillData(connection, query);
        }