using System.IO;
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using NPOI.XSSF.UserModel;
using System;
using UAS_LabelMachine.Entity;
using UAS_LabelMachine.PublicMethod;
namespace UAS_LabelMachine
{
class ExcelHandler
{
DataHelper dh = SystemInf.dh;
///
/// 导出Excel,返回文件在客户端的路径
///
public string ExportExcel(DataTable dt, string FolderPath, string FileName)
{
//创建一个内存流,用来接收转换成Excel的内容
MemoryStream ms;
ms = DataTableToExcel(dt);
//以系统当前时间命名文件,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();
}
}
public static DataTable ExcelToDataTable(string filePath, bool isColumnName)
{
DataTable dataTable = null;
FileStream fs = null;
DataColumn column = null;
DataRow dataRow = null;
IWorkbook workbook = null;
ISheet sheet = null;
IRow row = null;
ICell cell = null;
int startRow = 0;
try
{
using (fs = File.OpenRead(filePath))
{
// 2007版本
if (filePath.IndexOf(".xlsx") > 0)
{
workbook = new XSSFWorkbook(fs);
}
// 2003版本
else if (filePath.IndexOf(".xls") > 0)
{
workbook = new HSSFWorkbook(fs);
}
if (workbook != null)
{
sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet
dataTable = new DataTable();
if (sheet != null)
{
int rowCount = sheet.LastRowNum;//总行数
if (rowCount > 0)
{
IRow firstRow = sheet.GetRow(0);//第一行
int cellCount = firstRow.LastCellNum;//列数
//构建datatable的列
if (isColumnName)
{
startRow = 1;//如果第一行是列名,则从第二行开始读取
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
cell = firstRow.GetCell(i);
if (cell != null)
{
if (cell.StringCellValue != null)
{
column = new DataColumn(cell.StringCellValue);
dataTable.Columns.Add(column);
}
}
}
}
else
{
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
column = new DataColumn("column" + (i + 1));
dataTable.Columns.Add(column);
}
}
//填充行
for (int i = startRow; i <= rowCount; ++i)
{
row = sheet.GetRow(i);
if (row == null) continue;
dataRow = dataTable.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
cell = row.GetCell(j);
if (cell == null)
{
dataRow[j] = "";
}
else
{
//CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
switch (cell.CellType)
{
case CellType.Blank:
dataRow[j] = "";
break;
case CellType.Numeric:
short format = cell.CellStyle.DataFormat;
//对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
if (format == 14 || format == 31 || format == 57 || format == 58)
dataRow[j] = cell.DateCellValue;
else
dataRow[j] = cell.NumericCellValue;
break;
case CellType.String:
dataRow[j] = cell.StringCellValue;
break;
}
}
}
dataTable.Rows.Add(dataRow);
}
}
}
}
}
return dataTable;
}
catch (Exception)
{
if (fs != null)
{
fs.Close();
}
return null;
}
}
///
/// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
///
///
///
public MemoryStream DataTableToExcel(DataTable DataTable)
{
//创建内存流
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;
}
sheet.SetColumnWidth(i, dataLength);
}
//首先画好第一行带颜色的,单独写出来,避免写在循环里面
IRow row = sheet.CreateRow(0);
//冻结第一行
sheet.CreateFreezePane(0, 1, 0, 1);
ICellStyle style = book.CreateCellStyle();
style.FillForegroundColor = HSSFColor.PaleBlue.Index;
style.FillPattern = FillPattern.BigSpots;
style.FillBackgroundColor = HSSFColor.LightGreen.Index;
//设置边框
style.BorderBottom = BorderStyle.Thick;
style.BorderLeft = BorderStyle.Thick;
style.BorderRight = BorderStyle.Thick;
style.BorderTop = BorderStyle.Thick;
row.HeightInPoints = 20;
//固定第一行
//row.RowStyle.IsLocked=true;
//给第一行的标签赋值样式和值
for (int j = 0; j < columnNum; j++)
{
row.CreateCell(j);
row.Cells[j].CellStyle = style;
row.Cells[j].CellStyle.VerticalAlignment = VerticalAlignment.Center;
row.Cells[j].CellStyle.Alignment = HorizontalAlignment.Center;
row.Cells[j].SetCellValue(DataTable.Columns[j].ColumnName);
}
//将DataTable的值循环赋值给book,Aligment设置居中
//之前已经画了带颜色的第一行,所以从i=1开始画
for (int i = 0; i < rowNum; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
row1.HeightInPoints = 20;
for (int j = 0; j < columnNum; j++)
{
row1.CreateCell(j);
row1.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString());
row1.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.Center;
}
}
//将book的内容写入内存流中返回
book.Write(ms);
return ms;
}
}
}