385 lines
14 KiB
C#
385 lines
14 KiB
C#
using NPOI.XSSF.UserModel;
|
||
using NPOI.HSSF.UserModel;
|
||
using NPOI.HPSF;
|
||
using NPOI.POIFS.FileSystem;
|
||
using NPOI.SS.UserModel;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.IO;
|
||
using System.Web;
|
||
using System.Runtime.InteropServices;
|
||
using Microsoft.Win32;
|
||
using System.Windows;
|
||
using System.Data.OleDb;
|
||
|
||
|
||
namespace HiiShe.Manager
|
||
{
|
||
public class ExcelHelper
|
||
{
|
||
private string fileName = null; //文件名
|
||
private IWorkbook workbook = null;
|
||
private FileStream fs = null;
|
||
private bool disposed;
|
||
|
||
public ExcelHelper(string fileName)
|
||
{
|
||
this.fileName = fileName;
|
||
disposed = false;
|
||
}
|
||
public ExcelHelper()
|
||
{ }
|
||
|
||
|
||
#region NPOI DataGridView 导出 EXCEL
|
||
/// <summary>
|
||
/// NPOI DataGridView 导出 EXCEL
|
||
/// </summary>
|
||
/// <param name="fileName"> 默认保存文件名</param>
|
||
/// <param name="dgv">DataGridView</param>
|
||
/// <param name="fontname">字体名称</param>
|
||
/// <param name="fontsize">字体大小</param>
|
||
public static void ExportExcel(string fileName, string fontname = "宋体", short fontsize = 10,params DataTable[] arraydgv)
|
||
{
|
||
int g = 0;
|
||
HSSFWorkbook workbook = new HSSFWorkbook();
|
||
foreach (DataTable dgv in arraydgv)
|
||
{
|
||
g++;
|
||
//检测是否有数据
|
||
//if (dgv.Rows.Count == 0)
|
||
// continue ;
|
||
//创建主要对象
|
||
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("Sheet"+g.ToString());
|
||
//设置字体,大小,对齐方式
|
||
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
|
||
HSSFFont font = (HSSFFont)workbook.CreateFont();
|
||
font.FontName = fontname;
|
||
font.FontHeightInPoints = fontsize;
|
||
style.SetFont(font);
|
||
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //居中对齐
|
||
//添加表头
|
||
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(0);
|
||
for (int i = 0; i < dgv.Columns.Count; i++)
|
||
{
|
||
dataRow.CreateCell(i).SetCellValue(dgv.Columns[i].ColumnName);
|
||
dataRow.GetCell(i).CellStyle = style;
|
||
}
|
||
//注释的这行是设置筛选的
|
||
//sheet.SetAutoFilter(new CellRangeAddress(0, dgv.Columns.Count, 0, dgv.Columns.Count));
|
||
//添加列及内容
|
||
for (int i = 0; i < dgv.Rows.Count; i++)
|
||
{
|
||
dataRow = (HSSFRow)sheet.CreateRow(i + 1);
|
||
for (int j = 0; j < dgv.Columns.Count; j++)
|
||
{
|
||
string ValueType = dgv.Rows[i][j].GetType().ToString();
|
||
string Value = dgv.Rows[i][j].ToString();
|
||
switch (ValueType)
|
||
{
|
||
|
||
case "System.DateTime"://日期类型
|
||
//System.DateTime dateV;
|
||
//System.DateTime.TryParse(Value, out dateV);
|
||
//dataRow.CreateCell(j).SetCellValue(dateV);
|
||
////break;
|
||
case "System.String"://字符串类型
|
||
dataRow.CreateCell(j).SetCellValue(Value);
|
||
break;
|
||
case "System.Boolean"://布尔型
|
||
bool boolV = false;
|
||
bool.TryParse(Value, out boolV);
|
||
dataRow.CreateCell(j).SetCellValue(boolV);
|
||
break;
|
||
case "System.Int16"://整型
|
||
case "System.Int32":
|
||
case "System.Int64":
|
||
case "System.Byte":
|
||
int intV = 0;
|
||
int.TryParse(Value, out intV);
|
||
dataRow.CreateCell(j).SetCellValue(intV);
|
||
break;
|
||
case "System.Decimal"://浮点型
|
||
case "System.Double":
|
||
double doubV = 0;
|
||
double.TryParse(Value, out doubV);
|
||
dataRow.CreateCell(j).SetCellValue(doubV);
|
||
break;
|
||
case "System.DBNull"://空值处理
|
||
dataRow.CreateCell(j).SetCellValue("");
|
||
break;
|
||
default:
|
||
dataRow.CreateCell(j).SetCellValue("");
|
||
break;
|
||
}
|
||
dataRow.GetCell(j).CellStyle = style;
|
||
//设置宽度
|
||
sheet.SetColumnWidth(j, (Value.Length + 10) * 256);
|
||
}
|
||
}
|
||
}
|
||
//保存文件
|
||
string saveFileName = "";
|
||
SaveFileDialog saveDialog = new SaveFileDialog();
|
||
saveDialog.DefaultExt = "qrdata";
|
||
saveDialog.Filter = "牵软网络交互文件|*.qrdata";
|
||
saveDialog.FileName = fileName;
|
||
MemoryStream ms = new MemoryStream();
|
||
if (saveDialog.ShowDialog() ==true)
|
||
{
|
||
saveFileName = saveDialog.FileName;
|
||
if (!CheckFiles(saveFileName))
|
||
{
|
||
MessageBox.Show("文件被占用,请关闭文件 " + saveFileName);
|
||
workbook = null;
|
||
ms.Close();
|
||
ms.Dispose();
|
||
return;
|
||
}
|
||
workbook.Write(ms);
|
||
FileStream file = new FileStream(saveFileName.Replace(".xls",".qrdata"), FileMode.Create);
|
||
workbook.Write(file);
|
||
file.Close();
|
||
workbook = null;
|
||
ms.Close();
|
||
ms.Dispose();
|
||
MessageBox.Show(fileName + " 保存成功", "提示");
|
||
}
|
||
else
|
||
{
|
||
workbook = null;
|
||
ms.Close();
|
||
ms.Dispose();
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 检测文件被占用
|
||
[DllImport("kernel32.dll")]
|
||
public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
|
||
[DllImport("kernel32.dll")]
|
||
public static extern bool CloseHandle(IntPtr hObject);
|
||
public const int OF_READWRITE = 2;
|
||
public const int OF_SHARE_DENY_NONE = 0x40;
|
||
public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
|
||
/// <summary>
|
||
/// 检测文件被占用
|
||
/// </summary>
|
||
/// <param name="FileNames">要检测的文件路径</param>
|
||
/// <returns></returns>
|
||
public static bool CheckFiles(string FileNames)
|
||
{
|
||
if (!File.Exists(FileNames))
|
||
{
|
||
//文件不存在
|
||
return true;
|
||
}
|
||
IntPtr vHandle = _lopen(FileNames, OF_READWRITE | OF_SHARE_DENY_NONE);
|
||
//if (vHandle == HFILE_ERROR)
|
||
//{
|
||
// //文件被占用
|
||
// return false;
|
||
//}
|
||
//文件没被占用
|
||
CloseHandle(vHandle);
|
||
return true;
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
|
||
|
||
public static void ToExcel(MemoryStream ms, string strFileName)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
public static void RenderToExcel(string strFileName, DataTable table)
|
||
{
|
||
MemoryStream ms = new MemoryStream();
|
||
using (table)
|
||
{
|
||
IWorkbook workbook = new HSSFWorkbook();
|
||
|
||
ISheet sheet = workbook.CreateSheet();
|
||
|
||
IRow headerRow = sheet.CreateRow(0);
|
||
// handling header.
|
||
foreach (DataColumn column in table.Columns)
|
||
headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value
|
||
// handling value.
|
||
int rowIndex = 1;
|
||
foreach (DataRow row in table.Rows)
|
||
{
|
||
IRow dataRow = sheet.CreateRow(rowIndex);
|
||
foreach (DataColumn column in table.Columns)
|
||
{
|
||
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
|
||
}
|
||
rowIndex++;
|
||
}
|
||
workbook.Write(ms);
|
||
ms.Flush();
|
||
ms.Position = 0;
|
||
}
|
||
}
|
||
|
||
public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
|
||
{
|
||
ISheet sheet = null;
|
||
DataTable data = new DataTable();
|
||
int startRow = 0;
|
||
try
|
||
{
|
||
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
|
||
//if (fileName.IndexOf(".xlsx") > 0) // 2007版本
|
||
// workbook = new XSSFWorkbook(fs);
|
||
//else if (fileName.IndexOf(".xls") > 0) // 2003版本
|
||
// workbook = new HSSFWorkbook(fs);
|
||
try
|
||
{
|
||
workbook = new XSSFWorkbook(fs);
|
||
}
|
||
catch
|
||
{
|
||
workbook = new HSSFWorkbook(fs);
|
||
}
|
||
|
||
if (sheetName != null)
|
||
{
|
||
sheet = workbook.GetSheet(sheetName);
|
||
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
|
||
{
|
||
sheet = workbook.GetSheetAt(0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sheet = workbook.GetSheetAt(0);
|
||
}
|
||
if (sheet != null)
|
||
{
|
||
IRow firstRow = sheet.GetRow(0);
|
||
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
|
||
|
||
if (isFirstRowColumn)
|
||
{
|
||
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
|
||
{
|
||
ICell cell = firstRow.GetCell(i);
|
||
if (cell != null)
|
||
{
|
||
string cellValue = cell.StringCellValue;
|
||
if (cellValue != null)
|
||
{
|
||
DataColumn column = new DataColumn(cellValue);
|
||
data.Columns.Add(column);
|
||
}
|
||
}
|
||
}
|
||
startRow = sheet.FirstRowNum + 1;
|
||
}
|
||
else
|
||
{
|
||
startRow = sheet.FirstRowNum;
|
||
}
|
||
//最后一列的标号
|
||
int rowCount = sheet.LastRowNum;
|
||
for (int i = startRow; i <= rowCount; ++i)
|
||
{
|
||
IRow row = sheet.GetRow(i);
|
||
if (row == null) continue; //没有数据的行默认是null
|
||
|
||
DataRow dataRow = data.NewRow();
|
||
for (int j = row.FirstCellNum; j < cellCount; ++j)
|
||
{
|
||
if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
|
||
dataRow[j] = row.GetCell(j).ToString();
|
||
}
|
||
data.Rows.Add(dataRow);
|
||
}
|
||
}
|
||
|
||
return data;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
throw ex;
|
||
}
|
||
}
|
||
|
||
public static DataTable DataEncryption(DataTable arrayData)
|
||
{
|
||
DataTable CloneData = new DataTable();
|
||
foreach (DataColumn dc in arrayData.Columns)
|
||
{
|
||
CloneData.Columns.Add(dc.ColumnName.ToDecrypt(), typeof(string));
|
||
}
|
||
|
||
for (int i = 0; i < arrayData.Rows.Count; i++)
|
||
{
|
||
CloneData.Rows.Add();
|
||
for (int j = 0; j < arrayData.Columns.Count; j++)
|
||
{
|
||
if (CloneData.Columns[j].ColumnName != "PROWERRIGHT")
|
||
{
|
||
CloneData.Rows[i][j] = arrayData.Rows[i][j].ToString().ToDecrypt();
|
||
}
|
||
}
|
||
}
|
||
|
||
return CloneData;
|
||
}
|
||
|
||
|
||
public String[] GetExcelSheetNames(string excelFile)
|
||
{
|
||
OleDbConnection objConn = null;
|
||
System.Data.DataTable dt = null;
|
||
|
||
try
|
||
{
|
||
String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
|
||
"Data Source=" + excelFile + ";Extended Properties=Excel 8.0;";
|
||
objConn = new OleDbConnection(connString);
|
||
objConn.Open();
|
||
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
|
||
|
||
if (dt == null)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
String[] excelSheets = new String[dt.Rows.Count];
|
||
for (int i = 0; i < dt.Rows.Count; i++)
|
||
{
|
||
excelSheets[i] = dt.Rows[i][2].ToString().Replace("$", "");
|
||
}
|
||
//int sheetsCounter = dt.Rows.Count;
|
||
|
||
return excelSheets;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine(ex.Message);
|
||
return null;
|
||
}
|
||
finally
|
||
{
|
||
if (objConn != null)
|
||
{
|
||
objConn.Close();
|
||
objConn.Dispose();
|
||
}
|
||
if (dt != null)
|
||
{
|
||
dt.Dispose();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |