//優化后導出excel
public System.IO.Stream ExcelStream(string search) //
{
var orderBusiniss = Containers.ObjectContainer.CreateObject<IOrderBusiness>();
var list = orderBusiniss.GetExcel(search);
NPOI.HSSF.UserModel.HSSFWorkbook hssfworkbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet1 = hssfworkbook.CreateSheet("生產計划");
//添加標題頭
sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 13));
NPOI.SS.UserModel.IRow rowTitle = sheet1.CreateRow(0);
rowTitle.Height = 30 * 20;//設置行高
var cellTitel = rowTitle.CreateCell(0);
//給標題頭添加格式
NPOI.SS.UserModel.ICellStyle styleTitle = hssfworkbook.CreateCellStyle();
styleTitle.Alignment = HorizontalAlignment.Center;//單元格水平居中
IFont fontTitle = hssfworkbook.CreateFont();//新建一個字體樣式對象
fontTitle.Boldweight = short.MaxValue;//設置字體加粗樣式
fontTitle.FontHeightInPoints = 16;//設置字體大小
styleTitle.SetFont(fontTitle);//使用SetFont方法將字體樣式添加到單元格樣式中
cellTitel.CellStyle = styleTitle;
cellTitel.SetCellValue(ApplicationContext.Current.CompanyName + "公司生產計划單");
//通過反射得到需要導出的屬性
Type orderExcel = typeof(OrderToExcel);
PropertyInfo[] ps = orderExcel.GetProperties();
string[] title = new string[] {
"序號",
"生產時間" ,
"訂單號",
"業務員",
"工程名稱",
"建築單位",
"施工部位",
"產品信息",
"特殊要求",
"方量(M3)",
"下單時間",
"聯系人",
"聯系電話",
"備注",
};
//添加行頭
NPOI.SS.UserModel.IRow rowHeader = sheet1.CreateRow(1);
//公共樣式:加邊框
NPOI.SS.UserModel.ICellStyle style = hssfworkbook.CreateCellStyle();
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
style.Alignment = HorizontalAlignment.Center;
NPOI.SS.UserModel.ICellStyle styleHeader = hssfworkbook.CreateCellStyle();
styleHeader.CloneStyleFrom(style);//克隆公共的樣式
styleHeader.Alignment = HorizontalAlignment.Center;//單元格水平居中
IFont fontHeader = hssfworkbook.CreateFont();//新建一個字體樣式對象
fontHeader.Boldweight = short.MaxValue;//設置字體加粗樣式
styleHeader.SetFont(fontHeader);//使用SetFont方法將字體樣式添加到單元格樣式中
for (int i = 0; i < ps.Length + 1; i++)
{
var cellHeard = rowHeader.CreateCell(i);
cellHeard.CellStyle = styleHeader;
cellHeard.SetCellValue(title[i]);
}
if (list != null)
{
//通過序列號,得到需要導出的字段
List<OrderToExcel> listExcel = list.ToObjectList<Order, OrderToExcel>();
//保存列集合的屬性信息數組
PropertyInfo[] oProps = null;
for (int i = 0; i < listExcel.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 2);
var cellNum = rowtemp.CreateCell(0, CellType.Numeric);
cellNum.CellStyle = style;
cellNum.SetCellValue(i + 1);
oProps = ((Type)listExcel[i].GetType()).GetProperties();
for (int j = 0; j < oProps.Length; j++)
{
Type colType = oProps[j].PropertyType;//得到屬性的類型
var value = oProps[j].GetValue(listExcel[i]);//得到屬性的值
var cell = rowtemp.CreateCell(j + 1);
cell.CellStyle = style;
cell.SetCellValue(value == null ? "" : value.ToString());
}
}
}
//自動調節行寬度
for (int i = 0; i < 15; i++)
sheet1.AutoSizeColumn(i);
System.IO.MemoryStream file = new System.IO.MemoryStream();
hssfworkbook.Write(file);
file.Seek(0, System.IO.SeekOrigin.Begin);
return file;
}
public class OrderToExcel
{
public Nullable<System.DateTime> ProductionTime { get; set; }
public string Code { get; set; }
public string BSalesman { get; set; }
public string ProjectName { get; set; }
public string ConstructionUnit { get; set; }
public string ConstructionSite { get; set; }
public string ProductName { get; set; }
public string WP { get; set; }
public Nullable<decimal> Number { get; set; }
public Nullable<System.DateTime> CreationTime { get; set; }
public string ContactPerson { get; set; }
public string ContactPhone { get; set; }
public string Remarks { get; set; }
}
之前做了導出excel功能,沒有樣式比較難看。最近優化了下,NPOI版本為最新版本2.0.4.1版本
優化添加:
1.添加了標題。
2.通過對象的屬性來導出excel,表頭添加也比較容易點。
