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
220 lines
7.7 KiB
3 weeks ago
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|