背景需求:
页面展示信息列表,需要将数据导出到Excel并加密sheet文件和工作簿结构。
代码思路:1.将数据转换为dataTable,2.将dataTable导出到Excel,3.处理加密。
文章目录
- 引入必要的dll文件
- 1.将数据转换为DataTable
- 2.将dataTable转换为excel
- 3. 加密excel
引入必要的dll文件
引用Spire.Xls。可以在类库节点右击引用,在管理NuGet程序包中找到并添加。
1.将数据转换为DataTable
DataTable newTable = new DataTable("Table_New");
DataColumn dc = new DataColumn();
newTable.Columns.Add("userName", Type.GetType("System.String"));
newTable.Columns.Add("Sex", Type.GetType("System.String"));
DataRow newRow;
//第一行的文字
newRow = newTable.NewRow();
//根据实际情况,填充单元格的值
newRow["userName"] = "你猜";
newRow["Sex"] = "男";
newTable.Rows.Add(newRow);
2.将dataTable转换为excel
Workbook workBook = new Workbook();
//Worksheet sheet = workBook.CreateEmptySheet("sheet名");//不知为何会生成3个控sheet,待研究
//创建空sheet
workBook.CreateEmptySheets(1);
Worksheet sheet = workBook.Worksheets[0];
sheet.Name = "sheet名";
//给A1单元格赋值
sheet.Range["A1"].Value = "我是A1单元格的内容";
//合并单元格合并A1:B1
sheet.Range["A1:B1"].Merge();
//合并单元格合并A1到B2的数据
//sheet.Range["A1:B2"].Merge();
//将dataTable中的数据插入Excel
sheet.InsertDataTable(table, false, 2, 1, -1, -1);
//动态合并单元格
//start为列名编码,count为行号
string start = GetColumnName(10);//假定取第十列的列名
int count =2;//假定,根据实际需求处理
sheet.Range[$"{start}{count}:F2"].Merge();
/// <summary>
/// 获取Excel列名
/// </summary>
/// <param name="dividend"></param>
/// <returns></returns>
private string GetColumnName(int dividend)
{
var columnName = string.Empty;
while (dividend > 0)
{
var modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo) + columnName;
dividend = (dividend - modulo) / 26;
}
return columnName;
}
2.1设置单元格格式
//将单元格设置为文本形式
sheet.Range[$"A1:E{table.Rows.Count + 1}"].NumberFormat = "@";
//文字居中
sheet.Range[$"A2:C2"].Style.HorizontalAlignment = HorizontalAlignType.Center;//水平居中
sheet.Range[$"A2:C2"].Style.VerticalAlignment = VerticalAlignType.Center;//垂直居中
//设置文字大小
sheet.Range[$"A1:C2"].Style.Font.FontName = "Calibri";//字体名称
sheet.Range[$"A1:C2"].Style.Font.Size = 11;//字体大小
//内边框
sheet.AllocatedRange[$"A1:E24"].BorderInside(LineStyleType.Thin, borderColor: ExcelColors.Black);
//外边框
sheet.AllocatedRange[$"A1:E24"].BorderAround(LineStyleType.Thin, borderColor: ExcelColors.Black);
//自适应宽度
sheet.AllocatedRange.AutoFitColumns();
//固定宽度
sheet.Range[$"A1:A5"].ColumnWidth = 10;
3. 加密excel
//加密工作簿结构
workBook.ProtectWorkbook(false, true, password);
//加密工作表,且允许调整列宽和行高
sheet.Protect(password, SheetProtectionType.FormattingColumns | SheetProtectionType.FormattingRows);
//保存excel文件
workBook.SaveToFile("Excel名称.xlsx", ExcelVersion.Version2010);
3.1加密后实现的效果:
a.工作薄的结构不允许更改,如图:
b.工作表不允许修改,但允许更改行高和列宽
点击单元格后,提示如下图: