Come importare tutti i fogli di Excel per set di dati in C#

Ho cercato su internet e non riuscivo a trovare una domanda simile. Tutti erano alla ricerca di un modo per importare un singolo foglio in un file excel, ma quello che voglio è quello di importare tutti i fogli del file DataTable‘s in DataSet senza conoscere i nomi dei fogli.

Non ho fatto le cose molto con Excel prima. Questo un esempio e parzialmente di lavoro codice che ho trovato su internet e si analizza solo il data sheet nome:

public static DataSet Parse(string fileName, string workSheetName)
{
    string connectionString = string.Format("provider=Microsoft.Jet.OLEDB.4.0; data source={0};Extended Properties=Excel 8.0;", fileName);
    string query = string.Format("SELECT * FROM [{0}$]", workSheetName);

    DataSet data = new DataSet();
    using (OleDbConnection con = new OleDbConnection(connectionString))
    {
        con.Open();
        OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
        adapter.Fill(data);
    }

    return data;
}

Nel codice qui sopra, come si può vedere, workSheetName deve essere passato in modo che la query può sapere dove guardare per importare. Nel mio caso, voglio attraversare tutte le lenzuola, non importa che cosa sono denominati come e importazione a singoli DataTable‘s di un DataSet.

Quindi, in sostanza, l’ultima cosa che sarà un DataSet in cui ogni DataTable contiene righe per ciascun foglio del file importato.

Si vuole veramente lavorare con csv file piuttosto che xls. Puoi salvarlo come csv?

InformationsquelleAutor Tarik | 2013-08-01

4 Replies
  1. 16

    Questo è un codice che mi è venuta e funziona perfettamente, ma ho visto che qualcun altro ha già aggiunto una risposta:

    static DataSet Parse(string fileName)
    {
        string connectionString = string.Format("provider=Microsoft.Jet.OLEDB.4.0; data source={0};Extended Properties=Excel 8.0;", fileName);
    
    
        DataSet data = new DataSet();
    
        foreach(var sheetName in GetExcelSheetNames(connectionString))
        {
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {    
                var dataTable = new DataTable();
                string query = string.Format("SELECT * FROM [{0}]", sheetName);
                con.Open();
                OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
                adapter.Fill(dataTable);
                data.Tables.Add(dataTable);
            }
        }
    
        return data;
    }
    
    static string[] GetExcelSheetNames(string connectionString)
    {
            OleDbConnection con = null;
            DataTable dt = null;
            con= new OleDbConnection(connectionString);
            con.Open();
            dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    
            if (dt == null)
            {
                return null;
            }
    
            String[] excelSheetNames = new String[dt.Rows.Count];
            int i = 0;
    
            foreach (DataRow row in dt.Rows)
            {
                excelSheetNames[i] = row["TABLE_NAME"].ToString();
                i++;
            }
    
            return excelSheetNames;
    }
    posso ottenere utilizzando sqlconnection?

    InformationsquelleAutor Tarik

  2. 14

    Perché mi annoiavo:

     static void Main(string[] args)
     {
                string filename = @"c:\temp\myfile.xlsx";    
                System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection( 
                            "Provider=Microsoft.ACE.OLEDB.12.0; " +
                             "data source='" + filename + "';" +
                                "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" ");
                myConnection.Open();
                DataTable mySheets = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });                
                DataSet ds = new DataSet();
                DataTable dt;
    
                for (int i = 0; i <= mySheets.Rows.Count; i++)
                {
                       dt =   makeDataTableFromSheetName(filename, mySheets.Rows[i]["TABLE_NAME"].ToString());
                       ds.Tables.Add(dt);
                }
     }
    
    private static DataTable makeDataTableFromSheetName(string filename, string sheetName)
    {      
        System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection(
        "Provider=Microsoft.ACE.OLEDB.12.0; " +
        "data source='" + filename + "';" +
        "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" ");
    
        DataTable dtImport = new DataTable();
        System.Data.OleDb.OleDbDataAdapter myImportCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sheetName + "$]", myConnection);
        myImportCommand.Fill(dtImport);
        return dtImport;
    }
    davvero utile per me:)

    InformationsquelleAutor Avitus

  3. 4

    La funzione che le è stato suggerito da Avitus è corretta, ma è la logica di errore, è necessario riscrivere in :

    DataTable dtImport = new DataTable();
    using ( System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection(
                "Provider=Microsoft.ACE.OLEDB.12.0; " +
                 "data source='" + filename + "';" +
                    "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" ")){
    
    
    using ( System.Data.OleDb.OleDbDataAdapter myImportCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sheetName + "$]", myConnection))
    myImportCommand.Fill(dtImport);
    } return dtImport;

    questo è corretto, in caso contrario è necessario disporre di connessione e dataadapter manualmente.

    InformationsquelleAutor user951083

  4. 0

    Questo potrebbe non essere il migliore e il più veloce, ma e ‘ un altro modo (Modifica – aggiunta l’eliminazione di celle vuote):

        public static DataSet ReadWorkbook(string excelFileName, bool useFirstRowAsColumnName = false)
        {
            var excel = new Microsoft.Office.Interop.Excel.Application();
            var workBook = excel.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);//MLHIDE
            try
            {
                System.Data.DataSet ds = new DataSet(excelFileName);
                foreach (var sheet0 in workBook.Worksheets)
                {
                    var sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheet0;
                    try
                    {
                        var dt = readSheet(sheet, useFirstRowAsColumnName);
                        if (dt != null)
                            ds.Tables.Add(dt);
                    }
                    finally
                    {
                        releaseObject(sheet);
                    }
                }
                return ds;
            }
            finally
            {
                workBook.Close(true, null, null);
                excel.Quit();
    
                releaseObject(workBook);
                releaseObject(excel);
            }
        }
    
        ///<summary>
        ///Returns null for empty sheets or if sheet is not found.
        ///</summary>
        public static DataTable ReadSheet(string excelFileName, string sheetName, bool useFirstRowAsColumnName = false)
        {
            var excel = new Microsoft.Office.Interop.Excel.Application();
            var workBook = excel.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);//MLHIDE
            try
            {
                foreach (var sheet0 in workBook.Worksheets)
                {
                    var sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheet0;
                    try
                    {
                        if (sheet.Name.Equals_Wildcard(sheetName))
                        {
                            var dt = readSheet(sheet, useFirstRowAsColumnName);
                            if (dt != null)
                                return dt;
                        }
                    }
                    finally
                    {
                        releaseObject(sheet);
                    }
                }
                return null;
            }
            finally
            {
                workBook.Close(true, null, null);
                excel.Quit();
    
                releaseObject(workBook);
                releaseObject(excel);
            }
        }
    
        ///<summary>
        ///Returns null for empty sheets
        ///</summary>
    private static DataTable readSheet(Microsoft.Office.Interop.Excel.Worksheet sheet, bool useFirstRowAsColumnName = false)
            {
                using (Dece.Common.BeginChangeCurrentCultureBlock_EN_us())
                {
                    var range = sheet.UsedRange;
                    try
                    {
                        object[,] values = (object[,])range.Value2;
                        int rowCount = values.GetLength(0);
                        int colCount = values.GetLength(1);
                        int rowCount0 = rowCount;
                        int colCount0 = colCount;
                        #region find row-col count
                        {
                            bool ok = false;
                            for (int row = rowCount; row > 0; row--)
                                if (!ok)
                                    for (int col = colCount; col > 0; col--)
                                    {
                                        var val = values[row, col];
                                        if ((val != null) && (!System.Convert.ToString(val).IsNullOrEmpty()))
                                        {
                                            rowCount = row;
                                            ok = true;
                                            break;
                                        }
                                    }
                                else
                                    break;
                        }
                        {
                            bool ok = false;
                            for (int col = colCount; col > 0; col--)
                                if (!ok)
                                    for (int row = rowCount; row > 0; row--)
                                    {
                                        var val = values[row, col];
                                        if ((val != null) && (!System.Convert.ToString(val).IsNullOrEmpty()))
                                        {
                                            colCount = col;
                                            ok = true;
                                            break;
                                        }
                                    }
                                else
                                    break;
                        }
                        #endregion
                        if ((rowCount > 0) && (colCount > 0))
                        {  
                            var dt = new DataTable(sheet.Name);
                            dt.BeginLoadData();
                            try
                            {
                                for (int col = 1; col <= colCount; col++)
                                    dt.Columns.Add_RenameIfRequired(useFirstRowAsColumnName ? values[1, col].ToString_NullProof() : col.ToString());
                                var arr = new object[colCount];
                                for (int row = useFirstRowAsColumnName ? 1 : 0; row < rowCount; row++)
                                {
                                    for (int col = 1; col <= colCount; col++)
                                        arr[col - 1] = values[row + 1, col];
                                    dt.Rows.Add(arr);
                                }
                            }
                            finally
                            {
                                dt.EndLoadData();
                            }
                            return dt;                        
                        }
                        else
                            return null;
                    }
                    finally
                    {
                        releaseObject(range);
                    }
                }
            }
    
        private static void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                throw new Exception("Unable to release the Object " + ex.ToString(), ex);//MLHIDE
            }
            finally
            {
                GC.Collect();
            }
        }

    InformationsquelleAutor Koray

Lascia un commento