Lỗi load dữ liệu từ excel lên datagridview

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

  • Thread starterlucmtg3000
  • Ngày gửi28/2/23
  • 1

các bác cho e hỏi e viết 1 hàm get dữ liệu và tạo 1 button. sau khi click vào button thì dữ liệu load lên datagridview được. nhưng e copy hàm get đó vào sự kiện form load sao nó ko tự động load lên datagridview đc (mặc dù dữ liệu trong database có nhiều rồi), e cảm ơn các bac nhiều

PHP:

Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
  Dim TmpArr, i As Long, j As Long, arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
  On Error Resume Next
  Set Dic = CreateObject("Scripting.Dictionary")
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  Chk = (InStr("><=", Left(FindStr, 1)) > 0)
  For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
    If Chk And FindStr <> "" Then
      TmpVal = CDbl(TmpArr(i, ColIndex))
      If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
    Else
      If Left(FindStr, 1) = "!" Then
        If Not (UCase(TmpArr(i, ColIndex)) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then Dic.Add i, ""
      Else
        If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
      End If
    End If
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim arr(LBound(TmpArr, 1) To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle, LBound(TmpArr, 2) To UBound(TmpArr, 2))
    For i = LBound(TmpArr, 1) - HasTitle To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        arr(i, j) = TmpArr(Tmp(i - LBound(TmpArr, 1) + HasTitle), j)
      Next
    Next
    If HasTitle Then
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        arr(LBound(TmpArr, 1), j) = TmpArr(LBound(TmpArr, 1), j)
      Next
    End If
  End If
  Filter2DArray = arr
End Function

Hi! Bạn Thuan199 ơi! Xin bạn giúp thì giúp cho trót luôn đi. Bây giờ mình vị vướng một chổ nữa là làm sao xóa và thêm 1 dòng trên Datagridview rồi sau đó mình nhấn nút cập nhật thì dữ liệu sẽ được lưu lại trong CSDL và file Excel đó vậy bạn. Cảm ơn bạn rất nhiều.

Trong lập trình phần mềm, tool hay cả website. Việc thao tác với file dữ liệu rất cần thiết. Và thao tác với file Excel cũng chiếm tần suất không nhỏ.

Ở bài này, Kteam sẽ hướng dẫn tới bạn Thao tác với file Excel trong C# dùng thư viện EPPlus. EPPlus có một lợi thế là có thể chạy luôn cả ở phía Server.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

  • Cài đặt sẵn VISUAL STUDIO.
  • Có kiến thức về C# CƠ BẢN, và LẬP TRÌNH WPF.

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Đọc file Excel trong C#
  • Ghi dữ liệu ra file Excel và định dạng Cell.

Đọc Excel trong C#

Đầu tiên, chúng ta mở Visual Studio và tạo một project mới

Chọn WPF APP(.NET Framework) hoặc Windows Forms App nếu bạn không rành WPF. Đặt tên project và chọn đường dẫn lưu solution của bạn.

Tại màn hình ban đầu của project.

Bạn thay cặp thẻ

<Grid> </Grid>

Bằng

<StackPanel>         <DataGrid Height="200" x:Name="dtgExcel"></DataGrid>         <Button x:Name="btnImport" Click="btnImport_Click" Content="Import"></Button>         <Button x:Name="btnExport" Click="btnExport_Click" Content="Export"></Button> </StackPanel>

Chúng ta tạo giao diện có một DataGrid để hiển thị dữ liệu từ Excel và hai Button Import & Export.

Code hoàn chỉnh của MainWindow.xaml

<Window x:Class="ExcelInCsharp.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    xmlns:local="clr-namespace:ExcelInCsharp"  
    mc:Ignorable="d"  
    Title="MainWindow" Height="350" Width="525">  
<StackPanel>  
    <DataGrid Height="200" x:Name="dtgExcel"></DataGrid>  
    <Button x:Name="btnImport" Click="btnImport_Click" Content="Import"></Button>  
    <Button x:Name="btnExport" Click="btnExport_Click" Content="Export"></Button>  
</StackPanel>  
</Window>

Một lưu ý nhỏ, trong sự kiện Click mình đã tạo sẵn một Event Click theo cách nhắc lệnh mà Visual Studio hỗ trợ đó là:

Gõ Click =

Một New Event Handler sẽ hiện lên > bạn chỉ cần nhấn Enter

Sẽ tự tạo một event ở code behind

Bạn nào đã có kiến thức WPF thì có thể bỏ qua. Bạn nào chưa biết có thể xem qua Serial LẬP TRÌNH WPF CƠ BẢN.

Đầu tiên, chúng ta sẽ thực hiện chức năng Import Excel. Code Behind như sau:

public partial class MainWindow : Window

{  
    public MainWindow()  
    {  
        InitializeComponent();  
    }
    private void btnImport_Click(object sender, RoutedEventArgs e)  
    {
    }
    private void btnExport_Click(object sender, RoutedEventArgs e)  
    {
    }  
}

Chúng ta sẽ bắt đầu Import thư viện EPPlus vào để dùng.

Cần 1 thư viện chính đó là EPPLus để thao tác với file Excel.

Mở tab Solution Explore > Nhấp chuột phải vào References \> chọn Manage Nuget Packages

r

Trong tab Nuget mở ra. Chọn Browse và gõ từ khóa Selenium vào thanh Search. Install Selenium.WebDriver và Selenium.Chrome.WebDriver hoặc Selenium.Firefox.WebDriver tùy theo trình duyệt bạn dùng.

Chúng ta cần một file excel mẫu để thử Import. Mình tạo sẵn 1 file excel có cấu trúc như sau trong folder Debug. Có tên là:

ImportData.xlsx

Và mình cũng tạo một class gọi là UserInfo để lưu dữ liệu chúng ta đọc được và để đổ dữ liệu lên DataGrid cho thuận tiện.

public class UserInfo

{  
    public string Name { get; set; }  
    public DateTime Birthday { get; set; }  
}  

Và trong Event btnImport_Click mình sẽ dán đoạn code có comment chi tiết sau và chạy kết quả. Giải thích chi tiết sẽ nói tới trong video hướng dẫn.

Khuyến cáo: dùng tài liệu trên website và video cùng lúc để đạt hiệu quả cao.

private void btnImport_Click(object sender, RoutedEventArgs e)

    {  
        // tạo ra danh sách UserInfo rỗng để hứng dữ liệu.  
        List<UserInfo> userList = new List<UserInfo>();  
        try  
        {  
            // mở file excel  
            var package = new ExcelPackage(new FileInfo("ImportData.xlsx"));
            // lấy ra sheet đầu tiên để thao tác  
            ExcelWorksheet workSheet = package.Workbook.Worksheets[1];
            // duyệt tuần tự từ dòng thứ 2 đến dòng cuối cùng của file. lưu ý file excel bắt đầu từ số 1 không phải số 0  
            for (int i = workSheet.Dimension.Start.Row + 1; i <= workSheet.Dimension.End.Row; i++)  
            {  
                try  
                {  
                    // biến j biểu thị cho một column trong file  
                    int j = 1;
                    // lấy ra cột họ tên tương ứng giá trị tại vị trí [i, 1]. i lần đầu là 2  
                    // tăng j lên 1 đơn vị sau khi thực hiện xong câu lệnh  
                    string name = workSheet.Cells[i, j++].Value.ToString();
                    // lấy ra cột ngày sinh tương ứng giá trị tại vị trí [i, 2]. i lần đầu là 2  
                    // tăng j lên 1 đơn vị sau khi thực hiện xong câu lệnh  
                    // lấy ra giá trị ngày tháng và ép kiểu thành DateTime                        
                    var birthdayTemp = workSheet.Cells[i, j++].Value;  
                    DateTime birthday = new DateTime();  
                    if (birthdayTemp != null)  
                    {  
                        birthday = (DateTime)birthdayTemp;  
                    }
                    /*                         
                    Đừng lười biến mà dùng đoạn code này sẽ gây ra lỗi nếu giá trị value không thỏa kiểu DateTime
                    DateTime birthday = (DateTime)workSheet.Cells[i, j++].Value;
                     */
                    // tạo UserInfo từ dữ liệu đã lấy được  
                    UserInfo user = new UserInfo()  
                    {  
                       Name = name,  
                       Birthday = birthday  
                    };
                    // add UserInfo vào danh sách userList  
                    userList.Add(user);
                }  
                catch (Exception exe)  
                {
                }  
            }  
        }  
        catch (Exception ee)  
        {  
            MessageBox.Show("Error!");  
        }
        dtgExcel.ItemsSource = userList;  
    }  

Chạy thử nhấn button Import và xem kết quả

Chúng ta thấy dữ liệu từ file excel đã được đọc lên và đổ vào DataGrid một cách dễ dàng.


Export data ra Excel

Để xuất dữ liệu ra file excel chúng ta dùng đoạn code mẫu sau đã comment rõ ràng và hướng dẫn chi tiết trong video hướng dẫn nhé!

private void btnExport_Click(object sender, RoutedEventArgs e)

    {  
        string filePath = "";  
        // tạo SaveFileDialog để lưu file excel  
        SaveFileDialog dialog = new SaveFileDialog();
        // chỉ lọc ra các file có định dạng Excel  
        dialog.Filter = "Excel | *.xlsx | Excel 2003 | *.xls";
        // Nếu mở file và chọn nơi lưu file thành công sẽ lưu đường dẫn lại dùng  
        if (dialog.ShowDialog() == true)  
        {  
            filePath = dialog.FileName;  
        }
        // nếu đường dẫn null hoặc rỗng thì báo không hợp lệ và return hàm  
        if (string.IsNullOrEmpty(filePath))  
        {  
            MessageBox.Show("Đường dẫn báo cáo không hợp lệ");  
            return;  
        }
        try  
        {  
            using (ExcelPackage p = new ExcelPackage())  
            {  
                // đặt tên người tạo file  
                p.Workbook.Properties.Author = "Kteam by K9";
                // đặt tiêu đề cho file  
                p.Workbook.Properties.Title = "Báo cáo thống kê";
                //Tạo một sheet để làm việc trên đó  
                p.Workbook.Worksheets.Add("Kteam sheet");
                // lấy sheet vừa add ra để thao tác  
                ExcelWorksheet ws = p.Workbook.Worksheets[1];
                // đặt tên cho sheet  
                ws.Name = "Kteam sheet";  
                // fontsize mặc định cho cả sheet  
                ws.Cells.Style.Font.Size = 11;   
                // font family mặc định cho cả sheet  
                ws.Cells.Style.Font.Name = "Calibri";
                // Tạo danh sách các column header  
                string[] arrColumnHeader = {      
                                            "Họ tên",  
                                            "Năm sinh"                                                  
            };
                // lấy ra số lượng cột cần dùng dựa vào số lượng header  
                var countColHeader = arrColumnHeader.Count();
                // merge các column lại từ column 1 đến số column header  
                // gán giá trị cho cell vừa merge là Thống kê thông tni User Kteam  
                ws.Cells[1, 1].Value = "Thống kê thông tin User Kteam";  
                ws.Cells[1, 1, 1, countColHeader].Merge = true;  
                // in đậm  
                ws.Cells[1, 1, 1, countColHeader].Style.Font.Bold = true;  
                // căn giữa  
                ws.Cells[1, 1, 1, countColHeader].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                int colIndex = 1;  
                int rowIndex = 2;
                //tạo các header từ column header đã tạo từ bên trên  
                foreach (var item in arrColumnHeader)  
                {  
                    var cell = ws.Cells[rowIndex, colIndex];
                    //set màu thành gray  
                    var fill = cell.Style.Fill;  
                    fill.PatternType = ExcelFillStyle.Solid;  
                    fill.BackgroundColor.SetColor(System.Drawing.Color.LightBlue);
                    //căn chỉnh các border  
                    var border = cell.Style.Border;  
                    border.Bottom.Style =  
                        border.Top.Style =  
                        border.Left.Style =  
                        border.Right.Style = ExcelBorderStyle.Thin;
                    //gán giá trị  
                    cell.Value = item;
                    colIndex++;  
                }
                // lấy ra danh sách UserInfo từ ItemSource của DataGrid  
                List<UserInfo> userList = dtgExcel.ItemsSource.Cast<UserInfo>().ToList();
                // với mỗi item trong danh sách sẽ ghi trên 1 dòng  
                foreach (var item in userList)  
                {  
                    // bắt đầu ghi từ cột 1. Excel bắt đầu từ 1 không phải từ 0  
                    colIndex = 1;
                    // rowIndex tương ứng từng dòng dữ liệu  
                    rowIndex++;
                    //gán giá trị cho từng cell                        
                    ws.Cells[rowIndex, colIndex++].Value = item.Name;
                    // lưu ý phải .ToShortDateString để dữ liệu khi in ra Excel là ngày như ta vẫn thấy.Nếu không sẽ ra tổng số :v  
                    ws.Cells[rowIndex, colIndex++].Value = item.Birthday.ToShortDateString();  
                }                    
                //Lưu file lại  
                Byte[] bin = p.GetAsByteArray();  
                File.WriteAllBytes(filePath, bin);  
            }  
            MessageBox.Show("Xuất excel thành công!");  
        }  
        catch (Exception EE)  
        {  
            MessageBox.Show("Có lỗi khi lưu file!");  
        }  
    }  

Chúng ta thêm 1 giá trị trong DataGrid và nhấn Export.

Chọn nơi cần lưu file

Cùng xem kết quả nào!

Vậy là bạn đã nắm được cách thao tác với file Excel một cách dễ dàng. Thật đơn giản đúng không nào.


Source code tham khảo

Source code mẫu đi kèm bài viết, giúp bạn dễ dàng thao tác theo hướng dẫn và tham khảo tốt hơn.

ExcelInCSharp

Kết luận

Bài viết này đã sơ lược cho các bạn Cách thao tác với Excel trong C#.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quyên “Luyện tập – Thử thách – Không ngại khó”.



Tài liệu

Bài hướng dẫn này là một trong những CHIẾN DỊCH được phổ biến bởi Howkteam.com và sự đóng góp từ cộng đồng. Bạn có thể cùng mọi người yêu cầu và tài trợ để Kteam tạo ra nhiều khóa học hữu ích hơn nữa.

Truy cập và tìm hiểu chi tiết tại:

www.howkteam.vn/requests

Ngoài ra, Kteam hỗ trợ tính năng lưu trữ nội dung bài THAO TÁC VỚI EXCEL TRONG C# dưới dạng file PDF trong link bên dưới.

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.