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
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