Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Cách đọc một file .dbf có dạng form của excel?

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    1

    Mặc định Cách đọc một file .dbf có dạng form của excel?

    Mình có một file data(trong file đính kèm) có đuôi là DBF, mở bằng phần mềm chuyên dụng, hoặc excel, access đều đúng, mình cần viết đoạn code để cho dữ liệu trong file đó vào datatable. mình đã thử dùng code đọc file excel hay access đều không được, ai có cách nào đọc file đó vào datatable theo format của excel hay access bày cho mình với, .
    thanks
    code đọc file excel mình lấy từ diễn đàn
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    
    namespace GetExcelToDataGridView
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        // Khai báo và khởi tạo một chuỗi kết nối
                        String ChuoiKetNoi = "Provider = Microsoft.Jet.OLEDB.4.0;" +
                                                    "Data Source = " + openFileDialog1.FileName + ";" +
                                                    "Extended Properties = Excel 8.0;";
    
                        // Khai báo và khởi tạo một đối tượng kết nối
                        OleDbConnection DoiTuongKetNoi = new OleDbConnection(ChuoiKetNoi);
    
                        // Mở kết nối
                        DoiTuongKetNoi.Open();
    
                        // Cấu lệnh Sql
                        OleDbCommand CauLanhSql = new OleDbCommand("SELECT * FROM [D0022$]", DoiTuongKetNoi);
                        // "Danh sach khach o" là tên của một Sheet trong file Excel đính kèm của mình
                        // Bạn có thể thay thế nó cho đúng với file Excel của bạn, hoặc có thể thiết kế để cho người
                        //                sử dụng nhập vào cả tên Sheet cần lấy dữ liệu cũng được
    
                        OleDbDataAdapter BoChuyenDuLieu = new OleDbDataAdapter();
    
                        BoChuyenDuLieu.SelectCommand = CauLanhSql;
    
                        System.Data.DataTable Bang1 = new System.Data.DataTable();
    
                        // Lấy dữ liệu vào bảng
                        BoChuyenDuLieu.Fill(Bang1);
    
                        // Từ bảng đổ dữ liệu lên DataGridView
                        dataGridView1.DataSource = Bang1;
                        
                        DoiTuongKetNoi.Close();
    
                        DoiTuongKetNoi.Dispose();
                    }
                    catch
                    {
                        
                    }
                }
            }
        }
    }
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi bocon1903 : 05-01-2012 lúc 02:43 PM.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    ConnectionString là @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D0022.DBF;Extended Properties=dBase III"
    Tương tác như với database, ...

    Đừng hỏi thêm, sẽ không có câu trả lời nào cho bạn đâu!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    08 2011
    Nơi ở
    Yên Bái- Hà Nội
    Bài viết
    961

    hi. Có mà anh. Đó là file DB của Foxpro. Four có đoạn code đọc file DBF cool lắm. dùng thế này nè:
    Visual C# Code:
    1.  private void btnLoad_Click(object sender, EventArgs e)
    2.         {
    3.  
    4.             try
    5.             {
    6.                 OpenFileDialog ofd = new OpenFileDialog();
    7.                 ofd.Filter = "dBASE files (*.dbf)|*.dbf";
    8.                 ofd.ShowDialog();
    9.  
    10.                 if (ofd.FileName.Length > 0)
    11.                 {
    12.                     DataTable dt = ParseDBF.ReadDBF(@"D:\VB.Net\dbf\badge.DBF");//  (ofd.FileName);
    13.                     MessageBox.Show("ten" + ofd.FileName);
    14.                     insertDataBase(dt);
    15.  
    16.                     grvDBF.DataSource = dt;
    17.                 }
    18.             }
    19.             catch (Exception ex)
    20.             {
    21.                 MessageBox.Show(this, ex.Message + "\r\r" + ex.StackTrace, "Exception!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    22.             }
    23.         }
    đây là File để đọc. File này bạn có thể dịch thành DLL nếu muốn gọn nhẹ.
    Kết quả trả về là data table như tớ dùng ở trên đó. Khi ấy, muốn xào nấu gì thì tùy bạn.
    (bản quyền của Tây, ko nhớ rõ ai nữa.hihi)
    Visual C# Code:
    1.  using System;
    2. using System.Collections;
    3. using System.Data;
    4. using System.IO;
    5. using System.Runtime.InteropServices;
    6. using System.Text;
    7.  
    8.  
    9. // Read an entire standard DBF file into a DataTable
    10. public class ParseDBF
    11. {
    12.     // This is the file header for a DBF. We do this special layout with everything
    13.     // packed so we can read straight from disk into the structure to populate it
    14.     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    15.     private struct DBFHeader
    16.     {
    17.         public byte version;
    18.         public byte updateYear;
    19.         public byte updateMonth;
    20.         public byte updateDay;
    21.         public Int32 numRecords;
    22.         public Int16 headerLen;
    23.         public Int16 recordLen;
    24.         public Int16 reserved1;
    25.         public byte incompleteTrans;
    26.         public byte encryptionFlag;
    27.         public Int32 reserved2;
    28.         public Int64 reserved3;
    29.         public byte MDX;
    30.         public byte language;
    31.         public Int16 reserved4;
    32.     }
    33.  
    34.     // This is the field descriptor structure. There will be one of these for each column in the table.
    35.     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    36.     private struct FieldDescriptor
    37.     {
    38.         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
    39.         public string fieldName;
    40.         public char fieldType;
    41.         public Int32 address;
    42.         public byte fieldLen;
    43.         public byte count;
    44.         public Int16 reserved1;
    45.         public byte workArea;
    46.         public Int16 reserved2;
    47.         public byte flag;
    48.         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
    49.         public byte[] reserved3;
    50.         public byte indexFlag;
    51.     }
    52.  
    53.     // Read an entire standard DBF file into a DataTable
    54.     public static DataTable ReadDBF(string dbfFile)
    55.     {
    56.         long start = DateTime.Now.Ticks;
    57.         DataTable dt = new DataTable();
    58.         BinaryReader recReader;
    59.         string number;
    60.         string year;
    61.         string month;
    62.         string day;
    63.         long lDate;
    64.         long lTime;
    65.         DataRow row;
    66.         int fieldIndex;
    67.  
    68.         // If there isn't even a file, just return an empty DataTable
    69.         if ((false == File.Exists(dbfFile)))
    70.         {
    71.             return dt;
    72.         }
    73.  
    74.         BinaryReader br = null;
    75.         try
    76.         {
    77.             // Read the header into a buffer
    78.             br = new BinaryReader(File.OpenRead(dbfFile));
    79.             byte[] buffer = br.ReadBytes(Marshal.SizeOf(typeof(DBFHeader)));
    80.  
    81.             // Marshall the header into a DBFHeader structure
    82.             GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    83.             DBFHeader header = (DBFHeader) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(DBFHeader));
    84.             handle.Free();
    85.  
    86.             // Read in all the field descriptors. Per the spec, 13 (0D) marks the end of the field descriptors
    87.             ArrayList fields = new ArrayList();
    88.             while ((13 != br.PeekChar()))
    89.             {
    90.                 buffer = br.ReadBytes(Marshal.SizeOf(typeof(FieldDescriptor)));
    91.                 handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    92.                 fields.Add((FieldDescriptor)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FieldDescriptor)));
    93.                 handle.Free();
    94.             }
    95.  
    96.             // Read in the first row of records, we need this to help determine column types below
    97.             ((FileStream) br.BaseStream).Seek(header.headerLen + 1, SeekOrigin.Begin);
    98.             buffer = br.ReadBytes(header.recordLen);
    99.             recReader = new BinaryReader(new MemoryStream(buffer));
    100.  
    101.             // Create the columns in our new DataTable
    102.             DataColumn col = null;
    103.             foreach (FieldDescriptor field in fields)
    104.             {
    105.                 number = Encoding.ASCII.GetString(recReader.ReadBytes(field.fieldLen));
    106.                 switch (field.fieldType)
    107.                 {
    108.                     case 'N':
    109.                         if (number.IndexOf(".") > -1)
    110.                         {
    111.                             col = new DataColumn(field.fieldName, typeof(decimal));
    112.                         }
    113.                         else
    114.                         {
    115.                             col = new DataColumn(field.fieldName, typeof(int));
    116.                         }
    117.                         break;
    118.                     case 'C':
    119.                         col = new DataColumn(field.fieldName, typeof(string));
    120.                         break;
    121.                     case 'T':
    122.                         // You can uncomment this to see the time component in the grid
    123.                         //col = new DataColumn(field.fieldName, typeof(string));
    124.                         col = new DataColumn(field.fieldName, typeof(DateTime));
    125.                         break;
    126.                     case 'D':
    127.                         col = new DataColumn(field.fieldName, typeof(DateTime));
    128.                         break;
    129.                     case 'L':
    130.                         col = new DataColumn(field.fieldName, typeof(bool));
    131.                         break;
    132.                     case 'F':
    133.                         col = new DataColumn(field.fieldName, typeof(Double));
    134.                         break;
    135.                 }
    136.                 dt.Columns.Add(col);
    137.             }
    138.  
    139.             // Skip past the end of the header.
    140.             ((FileStream) br.BaseStream).Seek(header.headerLen, SeekOrigin.Begin);
    141.  
    142.             // Read in all the records
    143.             for (int counter = 0; counter <= header.numRecords - 1; counter++)
    144.             {
    145.                 // First we'll read the entire record into a buffer and then read each field from the buffer
    146.                 // This helps account for any extra space at the end of each record and probably performs better
    147.                 buffer = br.ReadBytes(header.recordLen);
    148.                 recReader = new BinaryReader(new MemoryStream(buffer));
    149.  
    150.                 // All dbf field records begin with a deleted flag field. Deleted - 0x2A (asterisk) else 0x20 (space)
    151.                 if (recReader.ReadChar() == '*')
    152.                 {
    153.                     continue;
    154.                 }
    155.  
    156.                 // Loop through each field in a record
    157.                 fieldIndex = 0;
    158.                 row = dt.NewRow();
    159.                 foreach (FieldDescriptor field in fields)
    160.                 {
    161.                     switch (field.fieldType)
    162.                     {
    163.                         case 'N':  // Number
    164.                             // If you port this to .NET 2.0, use the Decimal.TryParse method
    165.                             number = Encoding.ASCII.GetString(recReader.ReadBytes(field.fieldLen));
    166.                             if (IsNumber(number))
    167.                             {
    168.                                 if (number.IndexOf(".") > -1)
    169.                                 {
    170.                                     row[fieldIndex] = decimal.Parse(number);
    171.                                 }
    172.                                 else
    173.                                 {
    174.                                     row[fieldIndex] = int.Parse(number);
    175.                                 }
    176.                             }
    177.                             else
    178.                             {
    179.                                 row[fieldIndex] = 0;
    180.                             }
    181.  
    182.                             break;
    183.  
    184.                         case 'C': // String
    185.                             row[fieldIndex] = Encoding.ASCII.GetString(recReader.ReadBytes(field.fieldLen));
    186.                             break;
    187.  
    188.                         case 'D': // Date (YYYYMMDD)
    189.                             year = Encoding.ASCII.GetString(recReader.ReadBytes(4));
    190.                             month = Encoding.ASCII.GetString(recReader.ReadBytes(2));
    191.                             day = Encoding.ASCII.GetString(recReader.ReadBytes(2));
    192.                             row[fieldIndex] = System.DBNull.Value;
    193.                             try
    194.                             {
    195.                                 if (IsNumber(year) && IsNumber(month) && IsNumber(day))
    196.                                 {
    197.                                     if ((Int32.Parse(year) > 1900))
    198.                                     {
    199.                                         row[fieldIndex] = new DateTime(Int32.Parse(year), Int32.Parse(month), Int32.Parse(day));
    200.                                     }
    201.                                 }
    202.                             }
    203.                             catch
    204.                             {}
    205.  
    206.                             break;
    207.  
    208.                         case 'T': // Timestamp, 8 bytes - two integers, first for date, second for time
    209.                             // Date is the number of days since 01/01/4713 BC (Julian Days)
    210.                             // Time is hours * 3600000L + minutes * 60000L + Seconds * 1000L (Milliseconds since midnight)
    211.                             lDate = recReader.ReadInt32();
    212.                             lTime = recReader.ReadInt32() * 10000L;
    213.                             row[fieldIndex] = JulianToDateTime(lDate).AddTicks(lTime);
    214.                             break;
    215.  
    216.                         case 'L': // Boolean (Y/N)
    217.                             if ('Y' == recReader.ReadByte())
    218.                             {
    219.                                 row[fieldIndex] = true;
    220.                             }
    221.                             else
    222.                             {
    223.                                 row[fieldIndex] = false;
    224.                             }
    225.  
    226.                             break;
    227.  
    228.                         case 'F':
    229.                             number = Encoding.ASCII.GetString(recReader.ReadBytes(field.fieldLen));
    230.                             if (IsNumber(number))
    231.                             {
    232.                                 row[fieldIndex] = double.Parse(number);
    233.                             }
    234.                             else
    235.                             {
    236.                                 row[fieldIndex] = 0.0F;
    237.                             }
    238.                             break;
    239.                     }
    240.                     fieldIndex++;
    241.                 }
    242.  
    243.                 recReader.Close();
    244.                 dt.Rows.Add(row);
    245.             }
    246.         }
    247.  
    248.         catch
    249.         {
    250.             throw;
    251.         }
    252.         finally
    253.         {
    254.             if (null != br)
    255.             {
    256.                 br.Close();
    257.             }
    258.         }
    259.  
    260.         long count = DateTime.Now.Ticks - start;
    261.  
    262.         return dt;
    263.     }
    264.  
    265.     /// <summary>
    266.     /// Simple function to test is a string can be parsed. There may be a better way, but this works
    267.     /// If you port this to .NET 2.0, use the new TryParse methods instead of this
    268.     ///   *Thanks to wu.qingman on code project for fixing a bug in this for me
    269.     /// </summary>
    270.     /// <param name="number">string to test for parsing</param>
    271.     /// <returns>true if string can be parsed</returns>
    272.     public static bool IsNumber(string numberString)
    273.     {
    274.         char[] numbers = numberString.ToCharArray();
    275.         int number_count = 0;
    276.         int point_count = 0;
    277.         int space_count = 0;
    278.  
    279.         foreach (char number in numbers)
    280.         {
    281.             if ((number >= 48 && number <= 57))
    282.             {
    283.                 number_count += 1;
    284.             }
    285.             else if (number == 46)
    286.             {
    287.                 point_count += 1;
    288.             }
    289.             else if (number == 32)
    290.             {
    291.                 space_count += 1;
    292.             }
    293.             else
    294.             {
    295.                 return false;
    296.             }
    297.         }
    298.  
    299.         return (number_count > 0 && point_count < 2);
    300.     }
    301.  
    302.     /// <summary>
    303.     /// Convert a Julian Date to a .NET DateTime structure
    304.     /// Implemented from pseudo code at http://en.wikipedia.org/wiki/Julian_day
    305.     /// </summary>
    306.     /// <param name="lJDN">Julian Date to convert (days since 01/01/4713 BC)</param>
    307.     /// <returns>DateTime</returns>
    308.     private static DateTime JulianToDateTime(long lJDN)
    309.     {
    310.         double p = Convert.ToDouble(lJDN);
    311.         double s1 = p + 68569;
    312.         double n = Math.Floor(4 * s1 / 146097);
    313.         double s2 = s1 - Math.Floor((146097*n + 3) / 4);
    314.         double i = Math.Floor(4000 * (s2 + 1) / 1461001);
    315.         double s3 = s2 - Math.Floor(1461*i/4) + 31;
    316.         double q = Math.Floor(80 * s3 / 2447);
    317.         double d = s3 - Math.Floor(2447 * q / 80);
    318.         double s4 = Math.Floor(q / 11);
    319.         double m = q + 2 - 12 * s4;
    320.         double j = 100 * (n - 49) + i + s4;
    321.         return new DateTime(Convert.ToInt32(j), Convert.ToInt32(m), Convert.ToInt32(d));
    322.     }
    323.  
    324. }
    Skype: mrfour.it - Yahoo:mrfour_it
    Gmail: mrfour.it@gmail.com
    Bạn muốn học lập trình? Bạn chưa có kiến thức cơ bản? Bạn muốn học từ cơ bản tới nâng cao?... Bạn muốn có source code để tham khảo? Muốn có người hỗ trợ khi học?....http://www.laptrinh123.com sẽ giúp bạn những điều đó!

  4. #4
    Ngày gia nhập
    01 2011
    Bài viết
    46

    Thumbs up Pasres!

    Cám ơn bạn mrfour.it. Vấn đề đọc DBF trên x64 đã được giải quyết rồi!

  5. #5
    Ngày gia nhập
    08 2011
    Nơi ở
    Yên Bái- Hà Nội
    Bài viết
    961

    Hi. Ko có gì. Bác Foxpro hơi cổ nên hôm mình gặp cũng mất khá khá time mới kiếm dc giải pháp ngon lành.
    Skype: mrfour.it - Yahoo:mrfour_it
    Gmail: mrfour.it@gmail.com
    Bạn muốn học lập trình? Bạn chưa có kiến thức cơ bản? Bạn muốn học từ cơ bản tới nâng cao?... Bạn muốn có source code để tham khảo? Muốn có người hỗ trợ khi học?....http://www.laptrinh123.com sẽ giúp bạn những điều đó!

Các đề tài tương tự

  1. [Excel - C#] Đóng file Excel nhưng trong Task Manager vẫn còn?
    Gửi bởi nth4 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 18-05-2013, 05:15 PM
  2. Sử dụng file excel template có sẵn xuất ra report dạng excel?
    Gửi bởi ndnhan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 30-10-2012, 08:19 AM
  3. Làm sao để import file excel vào datagridview mà không cần mở file excel lên?
    Gửi bởi vthang.mta trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 10-09-2012, 03:35 PM
  4. Thêm cột vào file Excel ( sử dụng windows form lệnh alter table )
    Gửi bởi prt_awm trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 09-08-2012, 08:08 PM
  5. Đọc ghi file Excel | Truy xuất Excel, như thế nào?
    Gửi bởi khacthuy trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 01-04-2009, 08:54 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn