Bài viết

Kho tài liệu và bài viết được chia sẻ, đánh giá bởi cộng đồng

Export Excel trong MVVM

Vo Tan Duc đã tạo 20:04 23-09-2023 628 lượt xem 0 bình luận

Nội dung bài viết

MainWindow.xaml:

<Button Content="Export to Excel" Command="{Binding ExportExcelCommand}"></Button>

Tạo thư mục ViewModel, trong thư mục ViewModel, tạo class MainViewModel

MainViewModel.cs

private ObservableCollection<ProfileActor> _Profiles;
public ObservableCollection<ProfileActor> Profiles { get=>_Profiles; set { _Profiles = value;OnPropertyChanged(); } }
public MainViewModel() 
{ 
    ExportExcelCommand=new RelayCommand<object>((p)=>true, (p) => { ExportExcel(p); });
}
public ICommand ExportExcelCommand { get; set; }
private void ExportExcel(object p)
{
    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
    {
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        using (ExcelPackage x = new ExcelPackage())
        {
            // đặt tên người tạo file
            x.Workbook.Properties.Author ="Đức";

            // đặt tiêu đề cho file
            x.Workbook.Properties.Title = "Add data";

            //Tạo một sheet để làm việc trên đó
            x.Workbook.Worksheets.Add("Add data sheet");

            // lấy sheet vừa add ra để thao tác
            ExcelWorksheet ws = x.Workbook.Worksheets[0];

            // đặt tên cho sheet
            ws.Name = "Add data 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 = {
                                        "STT"
                                        "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 = "Add data";
            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++;
            }
            
            // với mỗi item trong danh sách sẽ ghi trên 1 dòng
            foreach (var item in Profiles)
            {
                // 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.Id;

                // 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();
                ws.Cells[rowIndex, colIndex++].Value = item.Name;

            }

            //Lưu file lại
            Byte[] bin = x.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!");
    }
}

Trong Folder ViewModel, tạo thêm 1 class BaseViewModel

BaseViewModel.cs

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
class RelayCommand<T> : ICommand
{
    private readonly Predicate<T> _canExecute;
    private readonly Action<T> _execute;

    public RelayCommand(Predicate<T> canExecute, Action<T> execute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _canExecute = canExecute;
        _execute = execute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute((T)parameter);
    }

    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}

 

 

Nội dung bài viết

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập

Câu hỏi mới nhất