using System.IO;
using System.Data;
using System;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.Formula.Eval;
using System.Text;
using UAS_MES.Entity;
namespace UAS_MES.DataOperate
{
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 string ExportExcel(DataTable dt, string FolderPath)
{
//创建一个内存流,用来接收转换成Excel的内容
MemoryStream ms;
ms = DataTableToExcel(dt);
//以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
string filePath = @FolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".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 DataTable ImportExcel(string FolderPath, string TableName)
{
DataTable dt = new DataTable();
dt.TableName = TableName;
if (FolderPath.Contains(".xls") || FolderPath.Contains(".xlsx") || FolderPath.Contains(".XLS") || FolderPath.Contains(".XLSX"))
{
using (FileStream file = new FileStream(FolderPath, FileMode.Open, FileAccess.Read))
{
//获取文件流
HSSFWorkbook workbook = new HSSFWorkbook(file);
ISheet sheet = workbook.GetSheetAt(0);
//获取所有的列名
foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells)
{
dt.Columns.Add(item.ToString().Trim(), typeof(string));
}
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
while (rows.MoveNext())
{
IRow row = (HSSFRow)rows.Current;
if (row.RowNum == sheet.FirstRowNum)
{
continue;
}
DataRow dr = dt.NewRow();
foreach (ICell item in row.Cells)
{
switch (item.CellType)
{
case CellType.BOOLEAN:
dr[item.ColumnIndex] = item.BooleanCellValue;
break;
case CellType.ERROR:
dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
break;
case CellType.FORMULA:
switch (item.CachedFormulaResultType)
{
case CellType.BOOLEAN:
dr[item.ColumnIndex] = item.BooleanCellValue;
break;
case CellType.ERROR:
dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
break;
case CellType.NUMERIC:
if (DateUtil.IsCellDateFormatted(item))
{
dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
}
else
{
dr[item.ColumnIndex] = item.NumericCellValue;
}
break;
case CellType.STRING:
string str = item.StringCellValue;
if (!string.IsNullOrEmpty(str))
{
dr[item.ColumnIndex] = str.ToString();
}
else
{
dr[item.ColumnIndex] = null;
}
break;
case CellType.Unknown:
case CellType.BLANK:
default:
dr[item.ColumnIndex] = string.Empty;
break;
}
break;
case CellType.NUMERIC:
if (DateUtil.IsCellDateFormatted(item))
{
dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
}
else
{
dr[item.ColumnIndex] = item.NumericCellValue;
}
break;
case CellType.STRING:
string strValue = item.StringCellValue;
if (!string.IsNullOrEmpty(strValue))
{
dr[item.ColumnIndex] = strValue.ToString();
}
else
{
dr[item.ColumnIndex] = null;
}
break;
case CellType.Unknown:
case CellType.BLANK:
default:
dr[item.ColumnIndex] = string.Empty;
break;
}
}
dt.Rows.Add(dr);
}
}
}
return dt;
}
///
/// 导入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)
{
//创建内存流
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.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;
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;
}
}
}