|
|
@ -1,5 +1,7 @@ |
|
|
|
using System.Collections; |
|
|
|
using System.Collections; |
|
|
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
using System.ComponentModel; |
|
|
|
using System.ComponentModel; |
|
|
|
|
|
|
|
using System.Data; |
|
|
|
using System.Reflection; |
|
|
|
using System.Reflection; |
|
|
|
using OfficeOpenXml; |
|
|
|
using OfficeOpenXml; |
|
|
|
using OfficeOpenXml.Style; |
|
|
|
using OfficeOpenXml.Style; |
|
|
@ -169,6 +171,143 @@ public static class IQueryableExtensions |
|
|
|
} |
|
|
|
} |
|
|
|
LoggerHelper.SendLog("生成文件 " + fname + " 完毕 " + dbCount + " 耗时 " + (int)(DateTime.Now - dt_start).TotalSeconds); |
|
|
|
LoggerHelper.SendLog("生成文件 " + fname + " 完毕 " + dbCount + " 耗时 " + (int)(DateTime.Now - dt_start).TotalSeconds); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public static void IntoFileFromLinqExcel(this DataTable db, string fname, string splitstr, Dictionary<string, string> fieldDescs, List<int> exportFieldsWidth, string headText = "", string totalText = "", bool isNeedItemNo = false) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (db.IsNull()) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
//查询文件状态 |
|
|
|
|
|
|
|
if (File.Exists(fname)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LoggerHelper.SendLog("文件已生成 " + fname); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
LoggerHelper.SendLog("正在生成文件 " + fname); |
|
|
|
|
|
|
|
DateTime dt_start = DateTime.Now; |
|
|
|
|
|
|
|
if (!File.Exists(fname)) |
|
|
|
|
|
|
|
File.Create(fname).Close(); |
|
|
|
|
|
|
|
//获取需要导出的字段 |
|
|
|
|
|
|
|
int dbCount = db.Rows.Count; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//列名排序,返回有序列表 |
|
|
|
|
|
|
|
var (fields, colunms) = Sort(fieldDescs, null); |
|
|
|
|
|
|
|
using (FileStream stream = File.Create(fname)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
using (ExcelPackage package = new ExcelPackage(stream)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var colunmsCount = colunms.Count; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var startCol = 0; |
|
|
|
|
|
|
|
var startRow = 1; // 初始行数 |
|
|
|
|
|
|
|
if (isNeedItemNo) |
|
|
|
|
|
|
|
startCol = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(headText)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1].Value = headText; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Merge = true; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Bold = true; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // Alignment is center |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Size = 14; |
|
|
|
|
|
|
|
startRow++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isNeedItemNo) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1].Value = "序号"; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, startRow, 1].Style.Font.Bold = true; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, 1, startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//写入列名 |
|
|
|
|
|
|
|
for (int i = 0; i < fields.Count; ++i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[startRow, i + 1 + startCol].Value = fields[i]; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.Font.Bold = true; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; |
|
|
|
|
|
|
|
worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
startRow++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int row = 0; row < dbCount; ++row) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (isNeedItemNo) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, 1].Value = row + 1; |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//遍历需要写入文件的字段 |
|
|
|
|
|
|
|
for (int i = 0; i < colunms.Count; ++i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, i + 1 + startCol].Value = db.Rows[row][colunms[i]].ToString(); |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; |
|
|
|
|
|
|
|
worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(totalText)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Cells[dbCount + startRow, 1].Value = "总计:"; |
|
|
|
|
|
|
|
worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; |
|
|
|
|
|
|
|
worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Value = totalText; |
|
|
|
|
|
|
|
worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Merge = true; |
|
|
|
|
|
|
|
startRow++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using (ExcelRange r = worksheet.Cells[1, 1, dbCount + startRow - 1, fields.Count + startCol]) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
r.Style.Border.Top.Style = ExcelBorderStyle.Thin; |
|
|
|
|
|
|
|
r.Style.Border.Left.Style = ExcelBorderStyle.Thin; |
|
|
|
|
|
|
|
r.Style.Border.Right.Style = ExcelBorderStyle.Thin; |
|
|
|
|
|
|
|
r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r.Style.Border.Top.Color.SetColor(Color.Black); |
|
|
|
|
|
|
|
r.Style.Border.Left.Color.SetColor(Color.Black); |
|
|
|
|
|
|
|
r.Style.Border.Right.Color.SetColor(Color.Black); |
|
|
|
|
|
|
|
r.Style.Border.Bottom.Color.SetColor(Color.Black); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (isNeedItemNo) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Column(1).Width = 20;//设置列宽为默认值 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//设置列宽 |
|
|
|
|
|
|
|
if (exportFieldsWidth == null || exportFieldsWidth.Count < fields.Count) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (int i = 0; i < fields.Count; ++i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Column(i + 1 + startCol).Width = 20;//设置列宽为默认值 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (int i = 0; i < fields.Count; ++i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
worksheet.Column(i + 1 + startCol).Width = exportFieldsWidth[i];//设置列宽为前段配置的值 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.Workbook.Properties.Title = "数据导出"; |
|
|
|
|
|
|
|
package.Workbook.Properties.Author = "SUZHOUEU"; |
|
|
|
|
|
|
|
package.Workbook.Properties.Comments = "苏州一优信息技术有限公司提供技术支持!"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.Workbook.Properties.Company = "苏州一优信息技术有限公司"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.Workbook.Properties.SetCustomPropertyValue("Checked by", "SimonHsiao"); |
|
|
|
|
|
|
|
package.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "SUZHOUEU"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.Save(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
LoggerHelper.SendLog("生成文件 " + fname + " 完毕 " + dbCount + " 耗时 " + (int)(DateTime.Now - dt_start).TotalSeconds); |
|
|
|
|
|
|
|
} |
|
|
|
private static string ConvertData2String<T>(T t, string field) where T : class
|
|
|
|
private static string ConvertData2String<T>(T t, string field) where T : class
|
|
|
|
{ |
|
|
|
{ |
|
|
|
if (t.FieldTypeIsDateTime(field)) |
|
|
|
if (t.FieldTypeIsDateTime(field)) |
|
|
@ -225,73 +364,6 @@ public static class IQueryableExtensions |
|
|
|
return (fields, colunms); |
|
|
|
return (fields, colunms); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
|
|
|
/// 获取数据 |
|
|
|
|
|
|
|
/// </summary> |
|
|
|
|
|
|
|
/// <param name="obj">对象</param> |
|
|
|
|
|
|
|
/// <param name="colunms"></param> |
|
|
|
|
|
|
|
/// <returns></returns> |
|
|
|
|
|
|
|
public static List<string> GetPropertyData<T>(T obj, List<string> colunms) where T : class
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
List<string> data = new List<string>(); |
|
|
|
|
|
|
|
//声明obj的类型 |
|
|
|
|
|
|
|
Type type = obj.GetType(); |
|
|
|
|
|
|
|
// 获取obj类型的所有属性信息 |
|
|
|
|
|
|
|
System.Reflection.PropertyInfo[] PropertyList = type.GetProperties(); |
|
|
|
|
|
|
|
//循环每一个属性 |
|
|
|
|
|
|
|
foreach (var item in PropertyList) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// 获取自定义特性 |
|
|
|
|
|
|
|
object[] export = item.GetCustomAttributes(typeof(ExportDatatAttribute), true); |
|
|
|
|
|
|
|
object[] descript = item.GetCustomAttributes(typeof(DescriptionAttribute), true); |
|
|
|
|
|
|
|
//判断是否需要导出 |
|
|
|
|
|
|
|
if (export.Length > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
//取值 |
|
|
|
|
|
|
|
var exdesc = ((ExportDatatAttribute)export[0]); |
|
|
|
|
|
|
|
// 是否嵌套 |
|
|
|
|
|
|
|
if (exdesc != null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
//是否是序列 |
|
|
|
|
|
|
|
if (exdesc.ExportDataFlag == "1") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var tmp = item.GetValue(obj) as IEnumerable; //List<ItemDetail> |
|
|
|
|
|
|
|
if (tmp != null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
foreach (var o in tmp) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
data.AddRange(GetPropertyData(o, colunms)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 如果是嵌套model |
|
|
|
|
|
|
|
else if (exdesc.ExportDataFlag == "2") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var tmp = item.GetValue(obj); |
|
|
|
|
|
|
|
if (tmp != null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
data.AddRange(GetPropertyData(tmp, colunms)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (exdesc.ExportDataFlag == "3") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (colunms.Contains(item.Name)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
data.Add(item.GetValue(obj).ToString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (descript.Length > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (colunms.Contains(item.Name)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
data.Add(item.GetValue(obj).ToString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return data; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取字段描述 |
|
|
|
#region 获取字段描述 |
|
|
|
/// <summary> |
|
|
|
/// <summary> |
|
|
|