using System;
using System.IO;
using System.Data;
using System.Collections;
using System.Data.OleDb;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Aspose.Cells;
using NPOI.SS.UserModel;
using System.Collections.Generic;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;
namespace Utils
{
/// <summary>
/// Excel操作类(包括:HSSFWorkbook、OleDb、Aspose、EPPlus、HttpResponse)
/// Spire.xls:http://www.cnblogs.com/landeanfen/p/5888973.html
/// </summary>
public class ExcelHelper
{
#region 读取Excel数据到DataTable
/// <summary>
/// HSSFWorkbook读取xls
/// </summary>
/// <param name="filepath">文件路径</param>
/// <returns></returns>
public static DataTable GetExcelToDataTableByNPOI(string filepath)
{
NPOI.HSSF.UserModel.HSSFWorkbook hssworkbook;
using (FileStream file = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
hssworkbook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
}
ISheet sheet = hssworkbook.GetSheetAt(0);
IRow headerRow = sheet.GetRow(0);
int rowCount = sheet.LastRowNum;
int cellCount = headerRow.LastCellNum;
DataTable dt = new DataTable();
for (int j = 0; j < cellCount; j++)
{
dt.Columns.Add(Convert.ToChar(((int)('A')) + j).ToString());
}
for (int r = (sheet.FirstRowNum + 1); r <= rowCount; r++)
{
IRow row = sheet.GetRow(r); //读取当前行数据
if (row != null)
{
DataRow dr = dt.NewRow();
cellCount = row.LastCellNum;
bool isCellNull = true;
for (int i = 0; i < cellCount; i++)
{
ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i] = "";
}
else
{
cell.SetCellType(NPOI.SS.UserModel.CellType.String);
dr[i] = cell.StringCellValue;
if (isCellNull)
{
if (!string.IsNullOrWhiteSpace(cell.StringCellValue))
{
isCellNull = false;
}
}
}
}
if (!isCellNull)
{
dt.Rows.Add(dr);
}
}
}
return dt;
}
/// <summary>
/// OleDb读取xls/xlsx
/// </summary>
/// <param name="filepath">文件路径</param>
/// <returns></returns>
public static DataTable GetExcelToDataTableByOleDb(string filepath)
{
string strCon = "";
if (filepath.IndexOf(".xlsx") != -1)
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filepath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
else if (filepath.IndexOf(".xls") != -1)
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filepath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
string strCom = " SELECT * FROM [Sheet1$]";
DataTable dt_temp = new DataTable();
using (OleDbConnection myConn = new OleDbConnection(strCon))
using (OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn))
{
myConn.Open();
myCommand.Fill(dt_temp);
}
return dt_temp;
}
/// <summary>
/// Aspose读取xls/xlsx
/// </summary>
/// <param name="filepath">文件路径</param>
/// <returns></returns>
public static DataTable GetExcelToDataTableByAspose(string filepath)
{
DataTable dt_temp = new DataTable();
try
{
Aspose.Cells.Workbook oBook = new Aspose.Cells.Workbook(filepath);
Cells cells = oBook.Worksheets[0].Cells;
dt_temp = cells.ExportDataTable(0, 0, cells.MaxDataRow + 1, cells.MaxColumn + 1);
}
catch (Exception ex)
{
}
return dt_temp;
}
#endregion
#region 导出DataTable/List数据到Excel
/// <summary>
/// 直接导出到HttpResponse输出流
/// </summary>
/// <param name="dt">需要导出的DataTable</param>
/// <param name="fileName">导出文件名称</param>
/// <param name="Title">表头</param>
public static void ExportToExcel(DataTable dt, string fileName, List<string> Title)
{
HttpResponse response = System.Web.HttpContext.Current.Response; ;
response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
Workbook workbook = new Workbook();
Worksheet sheet = (Worksheet)workbook.Worksheets[0];
int i = 0;
foreach (var item in Title)
{
Aspose.Cells.Style s = new Aspose.Cells.Style();
s.Font.IsBold = true;
sheet.Cells[0, i].PutValue(item);
sheet.Cells[0, i].SetStyle(s);
i++;
}
int RCount = dt.Rows.Count;
int CCount = dt.Columns.Count;
for (int x = 0; x < RCount; x++)
{
for (int y = 0; y < CCount; y++)
{
sheet.Cells[x + 1, y].PutValue(dt.Rows[x][y] + "");
}
}
response.Clear();
response.Buffer = true;
response.ContentEncoding = System.Text.Encoding.UTF8;
response.ContentType = "application/ms-excel";
response.BinaryWrite(workbook.SaveToStream().ToArray());
response.End();
}
/// <summary>
/// 直接导出到HttpResponse输出流,并自定义文件名
/// </summary>
public static void DataTableToExcel(DataTable dtData, String FileName)
{
GridView dgExport = null;
HttpContext curContext = HttpContext.Current;
StringWriter strWriter = null;
HtmlTextWriter htmlWriter = null;
if (dtData != null)
{
curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType = "application nd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
curContext.Response.Charset = "GB2312";
strWriter = new StringWriter();
htmlWriter = new HtmlTextWriter(strWriter);
dgExport = new GridView();
dgExport.DataSource = dtData.DefaultView;
dgExport.AllowPaging = false;
dgExport.DataBind();
dgExport.RenderControl(htmlWriter);
//curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString()); // 自动返回可下载的文件流
curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}
/// <summary>
/// Aspose导出数据到本地
/// </summary>
/// <param name="dt">要导出的数据</param>
/// <param name="tableName">表格标题</param>
/// <param name="path">保存路径</param>
public static void ExportToExcelByAspose(DataTable dt, string tableName, string path)
{
Workbook workbook = new Workbook(); //工作簿
Worksheet sheet = workbook.Worksheets[0]; //工作表
Cells cells = sheet.Cells;//单元格
////为标题设置样式
//Style styleTitle = workbook.Styles[workbook.Styles.Add()];//新增样式
//styleTitle.HorizontalAlignment = TextAlignmentType.Center;//文字居中
//styleTitle.Font.Name = "宋体";//文字字体
//styleTitle.Font.Size = 18;//文字大小
//styleTitle.Font.IsBold = true;//粗体
////样式2
//Style style2 = workbook.Styles[workbook.Styles.Add()];//新增样式
//style2.HorizontalAlignment = TextAlignmentType.Center;//文字居中
//style2.Font.Name = "宋体";//文字字体
//style2.Font.Size = 14;//文字大小
//style2.Font.IsBold = true;//粗体
//style2.IsTextWrapped = true;//单元格内容自动换行
//style2.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
//style2.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
//style2.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
//style2.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
////样式3
//Style style3 = workbook.Styles[workbook.Styles.Add()];//新增样式
//style3.HorizontalAlignment = TextAlignmentType.Center;//文字居中
//style3.Font.Name = "宋体";//文字字体
//style3.Font.Size = 12;//文字大小
//style3.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
//style3.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
//style3.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
//style3.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
int Colnum = dt.Columns.Count;//表格列数
int Rownum = dt.Rows.Count;//表格行数
//生成行1 标题行
//cells.Merge(0, 0, 1, Colnum);//合并单元格
//cells[0, 0].PutValue(tableName);//填写内容
//cells[0, 0].SetStyle(styleTitle);
//cells.SetRowHeight(0, 38);
//生成行2 列名行
for (int i = 0; i < Colnum; i++)
{
cells[0, i].PutValue(dt.Columns[i].ColumnName);
//cells[1, i].SetStyle(style2);
cells.SetRowHeight(0, 25);
}
//生成数据行
for (int i = 0; i < Rownum; i++)
{
for (int k = 0; k < Colnum; k++)
{
cells[1 + i, k].PutValue(dt.Rows[i][k].ToString());
//cells[2 + i, k].SetStyle(style3);
}
cells.SetRowHeight(1 + i, 24);
}
workbook.Save(path);
}
/// <summary>
/// EPPlus导出数据到本地
/// </summary>
/// <param name="pathFileName"></param>
/// <param name="IsPageRegistration"></param>
/// <param name="SearchContent"></param>
/// <param name="competitionId"></param>
private void ExportToExcelByEPPlus(string pathFileName, DataTable dt)
{
//创建存放Excel的文件夹
FileInfo newFile = new FileInfo(pathFileName);
if (newFile.Exists)
{
newFile.Delete();
newFile = new FileInfo(pathFileName);
}
//创建工作簿和工作表
using (ExcelPackage package = new ExcelPackage(newFile))
{
ExcelWorksheet workSheet = package.Workbook.Worksheets.Add("userInfo");
/*添加表头*/
workSheet.InsertRow(1, 1);
using (var range = workSheet.Cells[1, 1, 1, 6])
{
range.Merge = true;
range.Style.Font.SetFromFont(new System.Drawing.Font("Britannic Bold", 18, FontStyle.Italic));
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.CenterContinuous;
range.Style.Fill.PatternType = ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184, 204, 228));
range.Style.Font.Color.SetColor(Color.Black);
range.Value = "参赛者基本信息";
}
/*设置标题*/
workSheet.Cells[2, 1].Value = "队 别";
workSheet.Cells[2, 2].Value = "姓 名";
workSheet.Cells[2, 3].Value = "身份证号码";
workSheet.Cells[2, 4].Value = "省 份";
workSheet.Cells[2, 5].Value = "城 市";
workSheet.Cells[2, 6].Value = "学 校";
using (var range = workSheet.Cells[2, 1, 2, 6])
{
range.Style.Font.Bold = true;
range.Style.Fill.PatternType = ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(Color.DarkBlue);
range.Style.Font.Color.SetColor(Color.White);
range.AutoFilter = true;
}
/*设置单元格内容*/
int row = 3;
foreach (DataRow pUser in dt.Rows)
{
workSheet.Cells[row, 1].Value = pUser[0];
workSheet.Cells[row, 2].Value = pUser[1];
workSheet.Cells[row, 3].Value = pUser[2];
workSheet.Cells[row, 4].Value = pUser[3];
workSheet.Cells[row, 5].Value = pUser[4];
workSheet.Cells[row, 6].Value = pUser[5];
row++;
}
/*添加表尾*/
using (var range = workSheet.Cells[dt.Rows.Count + 3, 1, dt.Rows.Count + 3, 6])
{
range.Merge = true;
range.Style.Font.SetFromFont(new System.Drawing.Font("Britannic Bold", 18, FontStyle.Italic));
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.CenterContinuous;
range.Style.Fill.PatternType = ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184, 204, 228));
range.Style.Font.Color.SetColor(Color.Black);
range.Value = "总人数:" + dt.Rows.Count + "人";
}
/*设置整个Excel样式*/
workSheet.Cells[workSheet.Dimension.Address].AutoFitColumns();
workSheet.Cells[workSheet.Dimension.Address].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
workSheet.Cells[workSheet.Dimension.Address].Style.Border.Right.Style = ExcelBorderStyle.Thin;
workSheet.Cells[workSheet.Dimension.Address].Style.HorizontalAlignment = ExcelHorizontalAlignment.CenterContinuous;
package.Save();
}
}
/// <summary>
/// OLEDB将数据导出至Excel文件
/// </summary>
/// <param name="Table">DataTable对象</param>
/// <param name="Columns">要导出的数据列集合</param>
/// <param name="ExcelFilePath">Excel文件路径</param>
public static bool ExportToExcelByOLEDB(DataTable Table, ArrayList Columns, string ExcelFilePath)
{
if (File.Exists(ExcelFilePath))
{
throw new Exception("该文件已经存在!");
}
//如果数据列数大于表的列数,取数据表的所有列
if (Columns.Count > Table.Columns.Count)
{
for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++)
{
Columns.RemoveAt(s); //移除数据表列数后的所有列
}
}
//遍历所有的数据列,如果有数据列的数据类型不是 DataColumn,则将它移除
DataColumn column = new DataColumn();
for (int j = 0; j < Columns.Count; j++)
{
try
{
column = (DataColumn)Columns[j];
}
catch (Exception)
{
Columns.RemoveAt(j);
}
}
if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
{
Table.TableName = "Sheet1";
}
//数据表的列数
int ColCount = Columns.Count;
//创建参数
OleDbParameter[] para = new OleDbParameter[ColCount];
//创建表结构的SQL语句
string TableStructStr = @"Create Table " + Table.TableName + "(";
//连接字符串
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(connString);
//创建表结构
OleDbCommand objCmd = new OleDbCommand();
//数据类型集合
ArrayList DataTypeList = new ArrayList();
DataTypeList.Add("System.Decimal");
DataTypeList.Add("System.Double");
DataTypeList.Add("System.Int16");
DataTypeList.Add("System.Int32");
DataTypeList.Add("System.Int64");
DataTypeList.Add("System.Single");
DataColumn col = new DataColumn();
//遍历数据表的所有列,用于创建表结构
for (int k = 0; k < ColCount; k++)
{
col = (DataColumn)Columns[k];
//列的数据类型是数字型
if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0)
{
para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double);
objCmd.Parameters.Add(para[k]);
//如果是最后一列
if (k + 1 == ColCount)
{
TableStructStr += col.Caption.Trim() + " Double)";
}
else
{
TableStructStr += col.Caption.Trim() + " Double,";
}
}
else
{
para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar);
objCmd.Parameters.Add(para[k]);
//如果是最后一列
if (k + 1 == ColCount)
{
TableStructStr += col.Caption.Trim() + " VarChar)";
}
else
{
TableStructStr += col.Caption.Trim() + " VarChar,";
}
}
}
//创建Excel文件及文件结构
try
{
objCmd.Connection = objConn;
objCmd.CommandText = TableStructStr;
if (objConn.State == ConnectionState.Closed)
{
objConn.Open();
}
objCmd.ExecuteNonQuery();
}
catch (Exception exp)
{
throw exp;
}
//插入记录的SQL语句
string InsertSql_1 = "Insert into " + Table.TableName + " (";
string InsertSql_2 = " Values (";
string InsertSql = "";
//遍历所有列,用于插入记录,在此创建插入记录的SQL语句
for (int colID = 0; colID < ColCount; colID++)
{
if (colID + 1 == ColCount) //最后一列
{
InsertSql_1 += Columns[colID].ToString().Trim() + ")";
InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")";
}
else
{
InsertSql_1 += Columns[colID].ToString().Trim() + ",";
InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ",";
}
}
InsertSql = InsertSql_1 + InsertSql_2;
//遍历数据表的所有数据行
DataColumn DataCol = new DataColumn();
for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
{
for (int colID = 0; colID < ColCount; colID++)
{
//因为列不连续,所以在取得单元格时不能用行列编号,列需得用列的名称
DataCol = (DataColumn)Columns[colID];
if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "")
{
para[colID].Value = 0;
}
else
{
para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim();
}
}
try
{
objCmd.CommandText = InsertSql;
objCmd.ExecuteNonQuery();
}
catch (Exception exp)
{
string str = exp.Message;
}
}
try
{
if (objConn.State == ConnectionState.Open)
{
objConn.Close();
}
}
catch (Exception exp)
{
throw exp;
}
return true;
}
#endregion
}
}