none
excel讀取出來的資料是否可以以Data Table存取 RRS feed

  • 問題

  • 各位好

    小弟的問題如標題所示

    程式碼如下

    string time = DateTime.Now.ToString("yyyyMMddHHmm");
    string excelPath = @"D:\Temp\" + time + ".xls";//檔案位址,excel格式設為 .xls檔

    /**因小弟檔案的命名以執行當下的時間為檔名,故先有以上兩行設定**/

    DataTable excelTable = new DataTable();//做為接收excel資料的容器

        /**問題點:是否可以將excel讀到的資料存入Data Table**/
    StreamReader srExcel = new StreamReader(excelPath);//以StreamReader做為讀取excel檔的工具
    int counter = 0;//r紀錄從excel中讀到幾筆資料
    while (srExcel.ReadLine() != null)
    {
        Console.WriteLine(excelTable);//監看式用excelTable.Rows.Count,檢查是否將資料寫入excelTable
        counter++;//對比excel檔中有的資料行數量,如excel中有1426筆,而count=1426,即表示所有資料都有掃過一遍
    }
    srExcel.Close();//讀完檔後,將StreamReader關掉

    以上是要將excel讀進data table的片段的code

    煩請大大們幫小弟解惑

    data table是否可作為StreamReader的容器

    或者只適用SqlDataaAdapter

    感謝各位


    2016年5月10日 上午 02:48

解答

所有回覆

  • 使用 DataTable 要先給他欄位定義,也就是 DataColumn,要用 DataTable.Columns.Add() 加。

    有了 DataColumn 後,再用 NewRow() 來產生新資料列,填入資料,再用 DataTable.Rows.Add() 把資料列加進去。

    不過我好奇的是 Excel 又不是文字檔,你用 StreamReader 讀不了的吧...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:24
    2016年5月10日 上午 03:02
    版主
  • 可以寫入DataTable,但你要先定義DataTable出來,定義Column出來,再把xls讀到的資料填進去
    最後再add datarow到DataTable

    DataTable


    微軟免費線上課程

    HTML5 & JavaScript程式開發實戰(MyBook)

    開發ASP.NET您要瞭解的基楚

    http://www.dotblogs.com.tw/ian (MyBlog)

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:24
    2016年5月10日 上午 03:04
  • 讀取Excel文件可以用ADO.NET的技術比較方便, 您可以參考這篇文件的做法:Read and Write Excel Documents Using OLEDB

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:25
    2016年5月10日 上午 03:06
  • 感謝小朱、NO.18、tihs三位前輩的建議

    待小弟實作完前輩給的建議

    會再回覆成果

    謝謝

    2016年5月10日 上午 03:16
  • 使用OleDbConnection要特別注意xls的版本,有不同的連線宣告方式
    你可以考慮用NPOI套件來處理xls

    微軟免費線上課程

    HTML5 & JavaScript程式開發實戰(MyBook)

    開發ASP.NET您要瞭解的基楚

    http://www.dotblogs.com.tw/ian (MyBlog)

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:25
    2016年5月10日 上午 03:39
  • TO:NO.18

    好的,謝謝您!

    2016年5月10日 上午 05:39
  • 使用NPOI吧

    記得注意版本與各個Excel的欄位型態轉換

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:25
    2016年5月10日 上午 07:28
  • 預設只有 Office 2003 以前的 Driver ,新版 Driver 到 Microsoft 下載中心抓,搜尋 Access Runtime 。

    同時要有 x64 / x86 版本時,需安裝不同 Access Runtime 版本,例如 2016 x64 / 2013 x86

    OleDb / Odbc 都能存取 Excel 。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:25
    2016年5月10日 下午 02:29
  • 這裡有OLEDB 對 Excel 的 sample

    http://www.codeproject.com/Tips/705470/Read-and-Write-Excel-Documents-Using-OLEDB

    下這個就對不同Excel 版本的 connection string

    https://www.connectionstrings.com/excel/


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    • 已標示為解答 TravisRunner 2016年5月12日 上午 01:25
    2016年5月11日 上午 03:17
  • 各位先進、前輩好

    經過小弟這兩天的測試

    最後是選用NPOI的方式(直接從C#專案中的"管理Nuget套件"中下載)

    一開始就碰到讀檔的問題

    錯誤訊息:Invalid header signature; read 0x3331383030303136, expected 0xE11AB1A1E011CFD0

    MSDN:  http://ppt.cc/qDlet

    前幾天我也在論壇上發問一個FileStream下載檔案的問題

    目前小弟在練習的題目是:

    將FTP上的excel檔下載到硬碟,然後讀檔將excel檔讀入DataTable,最後將Data Table的內容用SqlBulkCopy的方式傳入資料庫。(檔案內容為一資料表,約30個欄位,500筆資料)

    因為下載的excel檔名是以(年-月-日-時-分)的格式,建檔的時間,動態命名。如下:

    string time = DateTime.Now.ToString("yyyyMMddHHmm");
    string excelPath = @"D:\Temp\" + time + ".xls";//出貨單檔案位址
    FileStream fsnpoi = new FileStream(excelPath, FileMode.Open);

    HSSFWorkbook workbook = new HSSFWorkbook(fsnpoi);   /*到這一行後跑出上面的錯誤訊息*/

    起初的判斷是無法讀取檔案,以為是讀取權限問題,但後來經測試發現不是。

    也想過是不是檔名的路徑,不能用動態方式

    於是路徑設定改成

    string testPath = @"D:\Temp\201605111009.xls";  /*路徑上的檔名改為固定的excel檔*/
    FileStream fsnpoi = new FileStream(testPath, FileMode.Open);

    但 HSSFWorkbook workbook = new HSSFWorkbook(fsnpoi);到這仍是一樣的錯誤訊息

    後來經小弟四處查詢資料後,找到這個http://www.cnblogs.com/liuxiaobo93/p/3570654.html

    發現原來我下載的excel檔,其實是.txt檔,只是把副檔名改成.xls

    於是顯示上變成excel檔。

    我另外做了測試

    建立一個新的excel檔,內容用複製原檔的方式,用記事本開啟,結果卻發現是亂碼

    再把下載來的excel檔,一樣用記事本開啟,結果卻是個整整齊齊的表格

    於是得證

    原來是我誤會了Orz

    原來我要讀取的一直都是個.txt檔,卻被我誤以為是.xls檔

    不過也因為如此

    讓小弟能多學到NPOI這個套件

    感謝各位先進、前輩的提點

    小弟再繼續鑽研.txt檔的讀取、切割欄位對應到Data Table的欄位

    再次感謝各位!

    謝謝大家

    2016年5月12日 上午 01:23
  • txt 看看是否符合 csv 格式,若符合,可使用 odbc 直接讀。

    參考這篇方式,用 Visual Studio IDE 的人機介面直接連接 txt 檔,連線字串可從屬性查得。

    也可以直接測試 SQL 語法。

    [VS2008] 讓伺服器總管叫出 ODBC 對話盒


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年5月12日 下午 03:14
  • txt是蠻像csv格式

    用excel開來看內容也是一個欄位整齊的資料表

    我將每筆資料以字串型態讀入後

    發現分隔符號是用 '\t',不是 ','

    不過這好像也符合csv格式廣義的定義 ((參閱wiki

    最後我用StreamReader來讀檔

    StreamReader srTxt = new StreamReader(路徑, System.Text.Encoding.Default);

    因為資料內容有繁體中字,若不指定編碼方式,會顯示亂碼

    但我把屬性值顯示出來的各種編碼方式都試過,卻發現都一樣是亂碼

    最後找到Text.Encoding.Default

    就順利顯示中字了

    再請教一下各位前輩

    我的理解是,若沒宣告編碼方式,理論上應該就是以default的方式

    可是我有沒有加 Text.Encoding.Default ,卻是亂碼/沒亂碼的差別

    這是StreamReader讀檔本身的編碼  VS Visual Studio預設的編碼的不同嗎?

    謝謝各位前輩

    2016年5月13日 上午 12:45
  • 你沒有用 VS IDE 環境測過?

    只要資料格式符合, txt / csv 可以直接轉成 DataTable


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年5月13日 下午 03:41