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;
namespace UAS_MES_NEW.DataOperate
{
class ExcelHandler
{
DataHelper dh = new DataHelper();
///
/// 导出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;
}
public string ExportExcel(DataTable dt, string FolderPath,string location)
{
//创建一个内存流,用来接收转换成Excel的内容
MemoryStream ms;
ms = DataTableToExcel(dt);
//以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
string filePath = @FolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") +location+ ".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);
}
}
}
if (FolderPath.Contains(".csv"))
{
dt = ReadFromCSV(FolderPath);
}
return dt;
}
///
/// 将CSV文件中内容读取到DataTable中
///
/// CSV文件路径
/// 是否将CSV文件的第一行读取为DataTable的列名
///
public static DataTable ReadFromCSV(string path, bool hasTitle = true)
{
DataTable dt = new DataTable(); //要输出的数据表
StreamReader sr = new StreamReader(path, System.Text.Encoding.GetEncoding("GB2312")); //文件读入流
bool bFirst = true; //指示是否第一次读取数据
//逐行读取
string line;
while ((line = sr.ReadLine()) != null)
{
string[] elements = line.Replace("\r", "").Replace("\n", "").Replace("\t", "").Split(',');
//第一次读取数据时,要创建数据列
if (bFirst)
{
for (int i = 0; i < elements.Length; i++)
{
dt.Columns.Add();
}
bFirst = false;
}
//有标题行时,第一行当做标题行处理
if (hasTitle)
{
for (int i = 0; i < dt.Columns.Count && i < elements.Length; i++)
{
dt.Columns[i].ColumnName = elements[i];
}
hasTitle = false;
}
else //读取一行数据
{
if (elements.Length == dt.Columns.Count)
{
dt.Rows.Add(elements);
}
else
{
//throw new Exception("CSV格式错误:表格各行列数不一致");
}
}
}
sr.Close();
return dt;
}
public void WriteTxt(DataTable dt, string FolderPath, string FileName)
{
StreamWriter sr;
string filePath = @FolderPath;
if (File.Exists(filePath + "\\" + FileName)) //如果文件存在,则创建File.AppendText对象
{
File.Delete(filePath + "\\" + FileName);
}
sr = File.CreateText(filePath + "\\" + FileName);
StringBuilder sb = new StringBuilder();
string Title = "";
foreach (DataColumn dc in dt.Columns)
{
Title += string.Format("{0,10}", dc.ColumnName.ToString());
}
sr.WriteLine(Title + "\r");
foreach (DataRow dr in dt.Rows)
{
string text = "";
for (int i = 0; i < dt.Columns.Count; i++)
{
text += String.Format("{0,10}", dr[i].ToString());
}
sr.WriteLine(text + "\r");
}
sr.Close();
}
///
/// 将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 = DataTable.Columns[i].ColumnName.Length;
sheet.SetColumnWidth(i, dataLength * 700);
}
//首先画好第一行带颜色的,单独写出来,避免写在循环里面
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;
}
}
}