You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

220 lines
7.7 KiB

using System.Data;
using System.IO;
using System;
using ClosedXML.Excel;
using System.Linq;
using ReZero.SuperAPI;
namespace ReZero.Excel
{
public class DataTableToExcel
{
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dts"></param>
/// <param name="name"></param>
/// <param name="widths"></param>
/// <returns></returns>
public static byte[] ExportExcel(ExcelData[] dts, string name, int[]? widths = null,string? navName=null)
{
XLWorkbook wb = new XLWorkbook();
// 添加导航工作表
var navigationSheet = wb.Worksheets.Add(TextHandler.GetCommonText("导航","Navigation"));
navigationSheet.Cell(1, 1).Value = TextHandler.GetCommonText(navName ?? "Sheet名称","Sheet Name");
navigationSheet.Cell(1, 2).Value = TextHandler.GetCommonText("备注","Description"); // 可以添加其他信息,例如描述
int index = 0;
int navRowIndex = 2; // 导航工作表的行索引
foreach (var data in dts)
{
var dt = data.DataTable!;
index++;
for (int i = 1; i < 15; i++)
{
// 删除Ignore列
if (dt.Columns.Contains("Column" + i))
{
dt.Columns.Remove("Column" + i);
}
}
var newdt = new DataTable();
foreach (DataColumn item in dt.Columns)
{
newdt.Columns.Add(item.ColumnName);
}
foreach (DataRow item in dt.Rows)
{
DataRow dr = newdt.NewRow();
foreach (DataColumn c in dt.Columns)
{
var value = item[c.ColumnName] + "";
dr[c.ColumnName] = value;
}
newdt.Rows.Add(dr);
}
string sheetName;
try
{
sheetName = dt.TableName;
wb.Worksheets.Add(newdt, sheetName);
}
catch
{
if (dt.TableName.Length < 28)
{
sheetName = "_" + dt.TableName;
wb.Worksheets.Add(newdt, sheetName);
}
else
{
sheetName = dt.TableName.Substring(0, 25) + DateTime.Now.ToString("...") + index;
wb.Worksheets.Add(newdt, sheetName);
}
}
var worksheet = wb.Worksheets.Last();
foreach (var item in worksheet.Tables)
{
item.Theme = XLTableTheme.None;
}
// 处理列
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cell(1, i + 1).Value = dt.Columns[i].ColumnName;
}
// 处理列宽
var colsWidth = dt.Columns.Cast<DataColumn>().Select(it => 20).ToArray();
if (widths != null)
{
colsWidth = widths;
}
for (int j = 1; j <= colsWidth.Length; j++)
{
worksheet.Columns(j, j).Width = colsWidth[j - 1];
}
// 在导航工作表中添加链接
var navCell = navigationSheet.Cell(navRowIndex, 1);
navCell.Value = sheetName;
navCell.SetHyperlink(new XLHyperlink($"'{sheetName}'!A1"));
navCell.Style.Font.FontColor = XLColor.Blue;
navCell.Style.Font.Underline = XLFontUnderlineValues.Single;
navigationSheet.Cell(navRowIndex, 2).Value = data.TableDescrpition;
navRowIndex++;
}
var minWidth = 50;
if (navigationSheet.Column(1).Width < minWidth)
{
navigationSheet.Column(1).Width = minWidth;
}
if (navigationSheet.Column(2).Width < minWidth)
{
navigationSheet.Column(2).Width = minWidth;
}
// 缓存到内存流,然后返回
byte[] bytes = null!;
using (MemoryStream stream = new MemoryStream())
{
wb.SaveAs(stream);
bytes = stream.ToArray();
}
return bytes;
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dts"></param>
/// <param name="name"></param>
/// <param name="widths"></param>
/// <returns></returns>
public static byte[] ExportExcel(DataSet dts, string name, int[]? widths = null, string? navName = null)
{
XLWorkbook wb = new XLWorkbook();
int index = 0;
foreach (DataTable data in dts.Tables)
{
var dt = data!;
index++;
for (int i = 1; i < 15; i++)
{
// 删除Ignore列
if (dt.Columns.Contains("Column" + i))
{
dt.Columns.Remove("Column" + i);
}
}
var newdt = new DataTable();
foreach (DataColumn item in dt.Columns)
{
newdt.Columns.Add(item.ColumnName);
}
foreach (DataRow item in dt.Rows)
{
DataRow dr = newdt.NewRow();
foreach (DataColumn c in dt.Columns)
{
var value = item[c.ColumnName] + "";
dr[c.ColumnName] = value;
}
newdt.Rows.Add(dr);
}
string sheetName;
try
{
sheetName = dt.TableName;
wb.Worksheets.Add(newdt, sheetName);
}
catch
{
if (dt.TableName.Length < 28)
{
sheetName = "_" + dt.TableName;
wb.Worksheets.Add(newdt, sheetName);
}
else
{
sheetName = dt.TableName.Substring(0, 25) + DateTime.Now.ToString("...") + index;
wb.Worksheets.Add(newdt, sheetName);
}
}
var worksheet = wb.Worksheets.Last();
foreach (var item in worksheet.Tables)
{
item.Theme = XLTableTheme.None;
}
// 处理列
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cell(1, i + 1).Value = dt.Columns[i].ColumnName;
}
// 处理列宽
var colsWidth = dt.Columns.Cast<DataColumn>().Select(it => 20).ToArray();
if (widths != null)
{
colsWidth = widths;
}
for (int j = 1; j <= colsWidth.Length; j++)
{
worksheet.Columns(j, j).Width = colsWidth[j - 1];
}
}
// 缓存到内存流,然后返回
byte[] bytes = null!;
using (MemoryStream stream = new MemoryStream())
{
wb.SaveAs(stream);
bytes = stream.ToArray();
}
return bytes;
}
}
}