C# 讀取csv、xls、xlsx表格(讀取到datatable、sql查詢語句讀取)

在開發過程中我們經常會用到excel的操作,這篇文章來講解讀取excel表格,

導出的文章可以查看我另一篇博客https://blog.csdn.net/qq_39569480/article/details/104426928

1.第一種方式  文件流讀取到datatable中

public DataTable Getcsv表格(string path)
        {
            return csv2dt(path, 0);
        }

/// <summary>
        /// 將Csv讀入DataTable
        /// </summary>
        /// <param name="filePath">csv文件路徑</param>
        /// <param name="n">表示第n行是字段title,第n+1行是記錄開始</param>
        /// <param name="k">可選參數表示最後K行不算記錄默認0</param>
        public DataTable csv2dt(string filePath, int n)
        {
            DataTable dt = new DataTable();
            String csvSplitBy = "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)";
            StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Default, false);
//StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Unicode, false);如果出現亂碼多換幾種編碼方式試一下
            int i = 0, m = 0;
            reader.Peek();
            while (reader.Peek() > 0)
            {
                m = m + 1;
                string str = reader.ReadLine();
                if (m >= n + 1)
                {
                    if (m == n + 1) //如果是字段行,則自動加入字段。
                    {
                        MatchCollection mcs = Regex.Matches(str, csvSplitBy);
                        foreach (Match mc in mcs)
                        {
                            dt.Columns.Add(mc.Value); //增加列標題
                        }
                    }
                    else
                    {
                        MatchCollection mcs = Regex.Matches(str, "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");
                        i = 0;
                        System.Data.DataRow dr = dt.NewRow();
                        foreach (Match mc in mcs)
                        {
                            dr[i] = mc.Value;
                            i++;
                        }
                        dt.Rows.Add(dr);  //DataTable 增加一行     
                    }

                }
            }
            return dt;
        } 

2.第二種方式  操作數據庫的方式寫查詢語句 

OLEDB的Excel的IMEX和HDR是什麼意思?

  Extended Properties=""Excel 8.0;HDR=yes;IMEX=1""

  A: HDR ( HeaDer Row )設置

  若指定值爲Yes,代表 Excel 檔中的工作表第一行是欄位名稱

  若指定值為 No,代表 Excel 檔中的工作表第一行就是資料了,沒有欄位名稱

  B:IMEX ( IMport EXport mode )設置

  IMEX 有三種模式,各自引起的讀寫行動也不合,容後再述:

  0 is Export mode

  1 is Import mode

  2 is Linked mode (full capabilities)

  我這裏希罕要申明的就是 IMEX 參數了,因爲不合的模式代表著不合的讀寫行動:

  當 IMEX=0 時爲“匯出模式”,這個模式開啓的 Excel 檔案只能用來做“寫入”用處。

  當 IMEX=1 時爲“匯入模式”,這個模式開啓的 Excel 檔案只能用來做“讀取”用處。

  當 IMEX=2 時爲“連結模式”,這個模式開啓的 Excel 檔案可同時增援“讀取”與“寫入”用處。

所謂“4.5010763038+14 ”只是顯示用的,實際還是“450107630382345”。所以使用讀取即 IMEX=1時,得到“4.5010763038+14 ”。

而 IMEX=0時,得到“450107630382345”。

 

單獨讀取csv文件方式(如果是csv格式要在csv同級目錄創建一個ini文件,不然讀不完整列)

ini文件內容

[a.csv]//文件名
Format=TabDelimited
ColNameHeader=True
MaxScanRows=0

#Col1=OrderID Text Width 10   這兩列可以指定讀取那些列   這裏不需要不寫這兩列則讀取全部列
#Col2=OrderName Text Width 30
[DllImport("kernel32")]
        public static extern long WritePrivateProfileString(string section, string key, string value, string iniPath);
 string fileName = csvPath.Replace(csvPath.Remove(csvPath.LastIndexOf("\\") + 1), "");
 WritePrivateProfileString(fileName, "Format", "TabDelimited", csvPath.Remove(csvPath.LastIndexOf("\\") + 1) + @"\Schema.ini");
                WritePrivateProfileString(fileName, "ColNameHeader", "True", csvPath.Remove(csvPath.LastIndexOf("\\") + 1) + @"\Schema.ini");
                WritePrivateProfileString(fileName, "MaxScanRows", "0", csvPath.Remove(csvPath.LastIndexOf("\\") + 1) + @"\Schema.ini"); 
                DateTable  dt =  CsvReader(fileName, csvPath);//文件名   路徑

幫助類讀取csv文件

  /// <summary>
        /// 讀取Csv文件返回DataSet
        /// </summary>
        /// <param name="sql">查詢語句 </param>
        /// <param name="FilePath">文件路徑 </param>
        /// <returns>Csv內容</returns>       
        public DataTable CsvReader(string fileName,string FilePath)
        {
            
            DataSet CsvData = new DataSet();
            DataTable dt = new DataTable();
            string strConnCSV = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FilePath.Remove(FilePath.LastIndexOf("\\") + 1) + ";Extended Properties='TEXT;IMEX=1;HDR=Yes;FMT=Delimited;CharacterSet=UNICODE;'";
            System.Data.OleDb.OleDbConnection objConn = new OleDbConnection(strConnCSV);
            objConn.Open();
            string strSql = "SELECT * FROM " + fileName; 
            System.Data.OleDb.OleDbDataAdapter odbcCSVDataAdapter = new OleDbDataAdapter(strSql, strConnCSV);
            odbcCSVDataAdapter.Fill(dt);
            return dt; 
        }

調用方法


DataTable dt = ToDataSet(Path); // 

幫助類讀取excel文件(.xls  .xlsx)

//數據返回到DataSet   
internal DataSet ToDataSet(string filePath)
{

string fileType = System.IO.Path.GetExtension(filePath);
if (string.IsNullOrEmpty(fileType)) return null;

if (fileType.ToLower() == ".xls")
{
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
}
else if (fileType.ToLower() == ".xlsx")
{
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";
}
else if (fileType.ToLower() == ".csv")
{
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath.Remove(filePath.LastIndexOf("\\") + 1) + ";Extended Properties='Text;FMT=Delimited;HDR=YES;'";
}
else {
MessageBox.Show("文件格式不不符合要求,此係統只支持導入xls,xlsx,csv 三種格式,詳情諮詢軟件供應商");
}
string sql_F = "Select * FROM [{0}]";

OleDbConnection conn = new OleDbConnection ();
OleDbDataAdapter da = null;
DataTable dtSheetName = null;

DataSet ds = new DataSet();
try
{
conn.ConnectionString=connStr;
conn.Open(); 
string SheetName = "";
dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

da = new OleDbDataAdapter();
for (int i = 0; i < dtSheetName.Rows.Count; i++)
{
SheetName = Convert.ToString(dtSheetName.Rows[i]["TABLE_NAME"]);

if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$"))
{
continue;
}
da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);
DataSet dsItem = new DataSet();
da.Fill(ds, "Mdt1");
DataTable table = ds.Tables["Mdt1"];
DataRow row = table.NewRow();
da.Update(ds, "Mdt1");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
// 關閉連接
if (conn.State == ConnectionState.Open)
{
conn.Close();
da.Dispose();
conn.Dispose();
}
}
return ds;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章