/// <summary>
/// 导出
/// </summary>
public ReportExcelData GetWorkORderExcel() {
ReportExcelData data= new ReportExcelData();
List<ExeclDataResource> execlDataResource = new List<ExeclDataResource>();
execlDataResource.Add(CreateInstrumentFailureExcelDocument());
IWorkbook workbook = ExcelUtilHelper.DataToHssfWorkbook(execlDataResource);
string base64;
using (MemoryStream stream = new MemoryStream())
{
workbook.Write(stream);
base64 = Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);
}
data.Base64 = base64;//base64数据前端处理
return data;
}
/// <summary>
/// 仪器故障统计
/// </summary>
public ExeclDataResource CreateInstrumentFailureExcelDocument()
{
ExeclDataResource execlDataResources = new ExeclDataResource();
Dictionary<string, string> title = new Dictionary<string, string>();
title.Add("customerid", "客户");
string sql = @"";
execlDataResources.SheetDataResource = ExcelUtilHelper.ConvertDataTableToList(this.Broker.ExecuteDataTable(sql)).ToList();
//throw new Exception(JsonHelper.Serialize(execlDataResources.SheetDataResource.Take(10).ToList()));
execlDataResources.SheetName = "SheetName";
execlDataResources.TitleIndex = 1;
execlDataResources.dicColumns = title;
return execlDataResources;
}
工具类ExcelUtilHelper
public static class ExcelUtilHelper
{
/// <summary>
/// 多个Sheet 导出
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="execlDatas"></param>
/// <returns></returns>
public static IWorkbook DataToHssfWorkbook(List<ExeclDataResource> execlDatas)
{
HSSFWorkbook _workbook = new HSSFWorkbook();
if (execlDatas == null && execlDatas.Count == 0)
{
return _workbook;
}
// 标题及内容单元格样式
var headCellStyle = CreateCellStyle(_workbook, true);
var contentCellStyle = CreateCellStyle(_workbook, false);
//每循环一次。就生成一个Sheet
foreach (var sheetResource in execlDatas)
{
if (sheetResource.SheetDataResource == null || sheetResource.SheetDataResource.Count == 0)
{
break;
}
//判断有多少数据如果超出 60000条 就新开一个sheet
var data = SplitList<object>(sheetResource.SheetDataResource,60000);
int p = 0;
foreach (var item in data) {
ISheet sheet = _workbook.CreateSheet(sheetResource.SheetName + (p == 0?"":p));
var dic = new Dictionary<int, int>();
//确定表头在哪一行生成
int titleIndex = 0;
if (sheetResource.TitleIndex >= 0)
{
titleIndex = sheetResource.TitleIndex - 1;
}
//基于当前创建Sheet页表头
IRow titleRow = sheet.CreateRow(titleIndex);
//表头创建
Dictionary<string, int> columns = new Dictionary<string, int>();
for (int i = 0; i < sheetResource.dicColumns.Count(); i++)
{
ICell cell = titleRow.CreateCell(i);
cell.SetCellValue(sheetResource.dicColumns.ToList()[i].Value.ToString());
cell.CellStyle = headCellStyle;
dic.Add(i, Encoding.Default.GetBytes(cell.StringCellValue).Length * 260 + 600);
columns.Add(sheetResource.dicColumns.ToList()[i].Value, i);
}
int x = 0;
foreach (var item3 in item)
{
IRow row = sheet.CreateRow(x + titleIndex + 1);
// 行高,避免自动换行的内容将行高撑开
row.HeightInPoints = 20f;
var entityValues = JsonHelper.Deserialize<Dictionary<string, object>>(JsonHelper.Serialize(item3));
foreach (var item2 in sheetResource.dicColumns)
{
if (entityValues == null)
{
throw new Exception(JsonHelper.Serialize(item3)+":::"+item2.Key +":"+ x);
}
int index = columns[item2.Value];
ICell cell = row.CreateCell(index);
cell.SetCellValue(entityValues?.GetValueOrDefault(item2.Key)?.ToString());
cell.CellStyle = contentCellStyle;
int length = Encoding.Default.GetBytes(cell.StringCellValue).Length * 256 + 600;
length = length > 15000 ? 15000 : length;
}
x++;
}
for (int i = 0; i < sheetResource.dicColumns.Count; i++)
{
sheet.SetColumnWidth(i, dic[i]);
}
p++;
}
//创建一个页签
}
return _workbook;
}
public static IEnumerable<List<T>> SplitList<T>(List<T> list, int chunkSize)
{
for (int i = 0; i < list.Count; i += chunkSize)
{
yield return list.Skip(i).Take(chunkSize).ToList();
}
}
public static IList<object> ConvertDataTableToList(DataTable table)
{
if (table == null)
{
return null;
}
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
rows.Add(row);
}
return ConvertTo(rows);
}
public static IList<object> ConvertTo(IList<DataRow> rows)
{
IList<object> list = null;
if (rows != null)
{
list = new List<object>();
foreach (DataRow row in rows)
{
object item = CreateItem(row);
list.Add(item);
}
}
return list;
}
public static object CreateItem(DataRow row)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
if (row != null)
{
foreach (DataColumn column in row.Table.Columns)
{
dict[column.ColumnName] = row[column.ColumnName];
}
}
return dict as object;
}
/// <summary>
/// 单元格样式
/// </summary>
/// <param name="workbook"></param>
/// <param name="isHead"></param>
/// <returns></returns>
private static ICellStyle CreateCellStyle(IWorkbook workbook, bool isHead)
{
var cellStyle = workbook.CreateCellStyle();
var font = workbook.CreateFont();
font.IsBold = isHead; // 粗体
cellStyle.SetFont(font);
if (isHead)
{
cellStyle.Alignment = HorizontalAlignment.Center; // 水平居中
cellStyle.VerticalAlignment = VerticalAlignment.Center; // 垂直居中
}
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.WrapText = true;//内容自动换行,避免存在换行符的内容合并成单行
return cellStyle;
}
}
ExeclDataResource
public class ExeclDataResource
{
/// <summary>
/// 保存到Sheet页的名称
/// </summary>
public string SheetName { get; set; }
/// <summary>
/// 标题所在行
/// </summary>
public int TitleIndex { get; set; }
/// <summary>
/// 每个Sheet的数据
/// </summary>
public List<object> SheetDataResource { get; set; }
/// <summary>
/// 每个Sheet的列
/// </summary>
public Dictionary<string, string> dicColumns { get; set; }
}