Excel导入导出帮助类

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

/// <summary>

///Excel导入导出帮助类

/// 记得引入 NPOI

/// 下载地址 http://npoi.codeplex.com/releases/

/// </summary>

public class ExcelHelper

{

#region 导出Excel

/// <summary>

/// 导出Excel 注:model 字段必须加[DisplayName("XXX")]不要导出的标为[DisplayName("null")],并且不要导出的字段放在最后,要导出的放前面

/// </summary>

/// <param name="p_List">数据集合</param>

/// <param name="p_Title">Excel路径</param>

/// <param name="ColumnsCount">总列数</param>

public void ToExcel<T>(List<T> p_List, string p_Title, int ColumnsCount)

{

if (p_List == null || p_List.Count <= 0 || ColumnsCount <= 0)

{

return;

}

PRopertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));

if (properties.Count <= 0)

{

return;

}

StringBuilder ExcelInfo = new StringBuilder();

string sign = string.Empty;

string DisplayName = string.Empty;

//写表头

for (int i = 0; i < ColumnsCount; i++)

{

DisplayName = properties[i].DisplayName;

if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")

{

sign = i == ColumnsCount - 1 ? "\n" : "\t";

ExcelInfo.AppendFormat("{0}{1}", DisplayName, sign);

}

}

//写表内容

for (int i = 0; i < p_List.Count; i++)

{

for (int j = 0; j < ColumnsCount; j++)

{

DisplayName = properties[j].DisplayName;

if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")

{

sign = j == ColumnsCount - 1 ? "\n" : "\t";

object obj = properties[j].GetValue(p_List[i]);

obj = obj == null ? string.Empty : obj.ToString();

ExcelInfo.AppendFormat("{0}{1}", obj, sign);

}

}

}

HttpResponse p_Response = HttpContext.Current.Response;

p_Response.Clear();

p_Response.ClearContent();

p_Response.Buffer = true;

//设置Http的头信息,编码格式

p_Response.AppendHeader("Content-Disposition", "attachment;filename=" + p_Title + ".xls");

p_Response.ContentType = "application/ms-excel";

//设置编码

p_Response.Charset = "gb2312";

p_Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");

p_Response.Write(ExcelInfo);

p_Response.Flush();

p_Response.Close();

p_Response.End();

}

#endregion

#region 导入Excel数据

/// <summary>

/// OleDB连接Excel文件 --> DataSet

/// </summary>

/// <param name="xlsFilePath">.xls文件路径</param>

/// <returns></returns>

public static DataSet XlsToDataSet(string xlsFilePath)

{

OleDbConnection oleDBConn = new OleDbConnection();

OleDbDataAdapter oleAdMaster = new OleDbDataAdapter();

DataSet ds = new DataSet();

try

{

FileInfo file = new FileInfo(xlsFilePath);

if (!file.Exists)

{

throw new Exception("文件不存在。");

}

string extension = file.Extension.ToLower();

StringBuilder oleDBConnStr = new StringBuilder();

switch (extension)

{

case ".xls":

oleDBConnStr.AppendFormat("Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=NO;IMEX=1';", xlsFilePath);//此连接只能操作Excel2007之前(.xls)文件

//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。

// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。

break;

case ".xlsx":

oleDBConnStr.AppendFormat("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';", xlsFilePath);

break;

default:

oleDBConnStr.AppendFormat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;HDR=YES;IMEX=1;", xlsFilePath);

break;

}

oleDBConn = new OleDbConnection(oleDBConnStr.ToString());

oleDBConn.Open();

DataTable tableStructure = oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (tableStructure != null && tableStructure.Rows.Count > 0)

{

tableStructure.TableName = tableStructure.Rows[0]["TABLE_NAME"].ToString();

StringBuilder sqlStr = new StringBuilder();

sqlStr.AppendFormat("select * from [{0}]", tableStructure.TableName);

oleAdMaster = new OleDbDataAdapter(sqlStr.ToString(), oleDBConn);

oleAdMaster.Fill(ds, "m_tableName");

if (ds.Tables["m_tableName"].Rows.Count <= 0)

{

throw new Exception("excel文件中没有有客户数据,请录入数据。");

}

}

else

{

throw new Exception("未能找到该上传的excel文件。");

}

}

finally

{

oleAdMaster.Dispose();

oleDBConn.Close();

oleDBConn.Dispose();

}

return ds;

}

#endregion

#region NPOI 导出Excel

private const Int32 MaxRowPerSheet = 65535;

private Int32 rowPerSheet = 1000;

public Int32 RowPerSheet

{

get { return rowPerSheet; }

set

{

if (value < 0 || value > MaxRowPerSheet)

{

throw new ArgumentOutOfRangeException("RowPerSheet");

}

else

{

rowPerSheet = value;

}

}

}

HSSFWorkbook hssfworkbook;

public void Export<T>(IList<T> records)

{

if (records.Count == 0)

throw new ArgumentNullException("无导出数据。");

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));

int ColumnsCount = properties.Count;

PropertyInfo[] props = new PropertyInfo[ColumnsCount];

string DisplayName = string.Empty;

for (int i = 0; i < ColumnsCount; i++)

{

DisplayName = properties[i].DisplayName;

if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")

{

props[i] = typeof(T).GetProperty(properties[i].Name); //注意属性数组仍然可以有元素为null

}

}

ISheet sheet = null;

IRow row = null;

for (int r = 0; r < records.Count; r++)

{

if ((r % RowPerSheet) == 0)

{

Int32 sheetIndex = (Int32)((Double)r / RowPerSheet) + 1;

sheet = hssfworkbook.CreateSheet("Sheet" + sheetIndex);

row = sheet.CreateRow(0);

for (int i = 0; i < ColumnsCount; i++)

{

DisplayName = properties[i].DisplayName;

if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")

{

row.CreateCell(i).SetCellValue(properties[i].DisplayName);

}

}

Console.WriteLine();

}

//注意CreateRow(Int32 rownum)中参数rownum虽然从第0行开始,但因为表头存在,每次得往下一行

row = sheet.CreateRow(r % RowPerSheet + 1);

for (int i = 0; i < props.Length; i++)

{

if (props[i] != null) //注意null检查

{

Object value = props[i].GetValue(records[r], null);

if (value != null)

{

row.CreateCell(i).SetCellValue(value.ToString());

}

}

}

}

for (Int32 i = 0; i < hssfworkbook.NumberOfSheets; i++)

{

sheet = hssfworkbook.GetSheetAt(i);

for (Int32 h = 0; h < ColumnsCount; h++)

{

sheet.AutoSizeColumn(h); //每列宽度自适应

}

}

}

/// <summary>

/// 导出Excel

/// </summary>

/// <typeparam name="T">泛型</typeparam>

/// <param name="records">数据</param>

/// <param name="filename">Excel名称</param>

public void SaveToExcel<T>(IList<T> records, string fileName)

{

RowPerSheet = 100;

string userAgent = HttpContext.Current.Request.ServerVariables["http_user_agent"].ToLower();

if (userAgent.IndexOf("Firefox") == -1)//判断是否是火狐浏览器

fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);

HttpResponse p_Response = HttpContext.Current.Response;

p_Response.ContentType = "application/vnd.ms-excel";

p_Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));

p_Response.Clear();

InitializeWorkbook();

Export<T>(records);

GetExcelStream().WriteTo(p_Response.OutputStream);

p_Response.End();

}

MemoryStream GetExcelStream()

{

//Write the stream data of workbook to the root directory

MemoryStream file = new MemoryStream();

hssfworkbook.Write(file);

return file;

}

void InitializeWorkbook()

{

hssfworkbook = new HSSFWorkbook();

////create a entry of DocumentSummaryInformation

DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();

// dsi.Company = "NPOI Team";

hssfworkbook.DocumentSummaryInformation = dsi;

////create a entry of SummaryInformation

SummaryInformation si = PropertySetFactory.CreateSummaryInformation();

// si.Subject = "NPOI SDK Example";

hssfworkbook.SummaryInformation = si;

}

#endregion

#region NPOI 导入Excel

/// <summary>

/// Excel转换DataTable

/// </summary>

/// <param name="FilePath">文件的绝对路径</param>

/// <returns>DataTable</returns>

public static DataTable ExcelInput(string FilePath)

{

DataTable dt = new DataTable();

HSSFWorkbook hssfworkbook;

using (FileStream file = new FileStream(FilePath, FileMode.Open, Fileaccess.Read))

{

hssfworkbook = new HSSFWorkbook(file);

}

ISheet sheet = hssfworkbook.GetSheetAt(0);

System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

IRow headerRow = sheet.GetRow(0);

int cellCount = headerRow.LastCellNum;

for (int j = 0; j < cellCount; j++)

{

ICell cell = headerRow.GetCell(j);

dt.Columns.Add(cell.ToString());

}

for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)

{

IRow row = sheet.GetRow(i);

DataRow dataRow = dt.NewRow();

for (int j = row.FirstCellNum; j < cellCount; j++)

{

if (row.GetCell(j) != null)

dataRow[j] = row.GetCell(j).ToString();

}

dt.Rows.Add(dataRow);

}

return dt;

}

#endregion

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航