using System.IO;
using System.Data;
using System;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
namespace UAS_LabelMachine
{
class ExcelHandler
{
DataHelper dh = new DataHelper();
///
/// 导出Excel,返回文件在客户端的路径
///
public string ExportExcel(DataTable dt, DataTable Captioon, string FolderPath, string FileName)
{
//创建一个内存流,用来接收转换成Excel的内容
MemoryStream ms;
ms = DataTableToExcel(dt, Captioon);
//以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
string filePath = @FolderPath + "\\" + FileName + ".xls";
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
//释放当前Excel文件,否则打开文件的时候会显示文件被占用
ms.Dispose();
fs.Dispose();
return filePath;
}
///
/// 导入Excel
///
public void ImportExcel(DataTable DataTable, string TableName)
{
int columnNum = DataTable.Columns.Count;
int rowNum = DataTable.Columns.Count;
string[] field = new string[columnNum];
for (int i = 0; i < columnNum; i++)
{
field[i] = DataTable.Rows[0][i].ToString();
}
}
///
/// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
///
///
///
public MemoryStream DataTableToExcel(DataTable DataTable, DataTable Captioon)
{
//创建内存流
MemoryStream ms = new MemoryStream();
//创建一个Book,相当于一个Excel文件
HSSFWorkbook book = new HSSFWorkbook();
//Excel中的Sheet
ISheet sheet = book.CreateSheet("sheet1");
//获取行数量和列数量
int rowNum = DataTable.Rows.Count;
int columnNum = DataTable.Columns.Count;
//设置列的宽度,根据首行的列的内容的长度来设置
for (int i = 0; i < columnNum; i++)
{
int dataLength;
//如果内容比标题短则取标题长度
if (DataTable.Rows[0][i].ToString().Length < DataTable.Columns[i].ColumnName.Length)
{
dataLength = DataTable.Columns[i].ColumnName.Length;
dataLength = dataLength * 600;
}
else
{
dataLength = DataTable.Rows[0][i].ToString().Length;
dataLength = dataLength * 500;
}
if (dataLength > 50000)
dataLength = 50000;
sheet.SetColumnWidth(i, dataLength);
}
ICellStyle style = book.CreateCellStyle();
style.FillForegroundColor = HSSFColor.PALE_BLUE.index;
style.FillPattern = FillPatternType.BIG_SPOTS;
style.FillBackgroundColor = HSSFColor.LIGHT_GREEN.index;
//设置边框
style.BorderBottom = BorderStyle.THICK;
style.BorderLeft = BorderStyle.THICK;
style.BorderRight = BorderStyle.THICK;
style.BorderTop = BorderStyle.THICK;
//首先画好第一行带颜色的,单独写出来,避免写在循环里面
int rowindex = 0;
if (Captioon.Rows[0]["es_engenable"].ToString() == "-1")
{
IRow row0 = sheet.CreateRow(rowindex);
for (int i = 0; i < Captioon.Rows.Count; i++)
{
row0.CreateCell(i).SetCellValue(Captioon.Rows[i]["esd_engcaption"].ToString());
row0.Cells[i].CellStyle = style;
row0.Cells[i].CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
row0.Cells[i].CellStyle.Alignment = HorizontalAlignment.CENTER;
}
rowindex = rowindex + 1;
}
if (Captioon.Rows[0]["es_chineseenable"].ToString() == "-1")
{
IRow row1 = sheet.CreateRow(rowindex);
for (int i = 0; i < Captioon.Rows.Count; i++)
{
row1.CreateCell(i).SetCellValue(Captioon.Rows[i]["esd_caption"].ToString());
row1.Cells[i].CellStyle = style;
row1.Cells[i].CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
row1.Cells[i].CellStyle.Alignment = HorizontalAlignment.CENTER;
}
rowindex = rowindex + 1;
}
//冻结第一行
sheet.CreateFreezePane(0, rowindex, 0, rowindex);
IRow row = sheet.CreateRow(rowindex);
row.HeightInPoints = 20;
//将DataTable的值循环赋值给book,Aligment设置居中
//之前已经画了带颜色的第一行,所以从i=1开始画
for (int i = 0; i < rowNum; i++)
{
row = sheet.CreateRow(i + rowindex);
row.HeightInPoints = 20;
for (int j = 0; j < columnNum; j++)
{
row.CreateCell(j);
row.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString());
row.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
}
}
for (int i = 0; i < DataTable.Columns.Count; i++)
{
sheet.AutoSizeColumn(i);
}
//将book的内容写入内存流中返回
book.Write(ms);
return ms;
}
}
}