您的位置:首页 > 其它

NPOI2.1.1操作Excel

2015-09-07 15:04 176 查看

1。参数说明:

(1)工作簿:(IWorkbook)

IWorkbook workbook=new HSSFWorkbook();(这里是2003版本的Excel的工作簿对象)

IWorkbook workbook=new XSSFWorkbook();(这里是2007版本的Excel的工作簿对象)

判断创建Excel工作簿对象是03还是07版本的,可以根据文档路径后缀名称来判断:

string fileEx = Path.GetExtension(absolutePath);
switch (fileEx)
{
case ".xls":
workbook = new HSSFWorkbook();
break;
default:
workbook = new XSSFWorkbook();
break;
}


(2)单元格(ISheet):

                   //命名单元格名称
string sheetName = string.IsNullOrEmpty(dt.TableName)
? "Sheet " + (++i).ToString()
: dt.TableName;
ISheet sheet = workbook.CreateSheet(sheetName);//创建单元格


//设置所有单元格默认宽度
sheet.DefaultColumnWidth = 3 * 5;

(3)单元格行(IRow):

//创建行
IRow headerRow = sheet.CreateRow(0);//这里0代表单元格第一行,1代表第二行,如此类推


单元格行高度可以这样子设置:

headerRow.Height = 30 * 17;

//创建第一行单元格设置列名称
headerRow.CreateCell(0).SetCellValue(columnName);

(4)单元格样式(ICellStyle):

//创建单元格样式对象
ICellStyle style = workbook.CreateCellStyle();
//自动转行
style.WrapText = true;
//垂直对齐居中
style.VerticalAlignment = VerticalAlignment.Center;
//水平对齐居中
style.Alignment = HorizontalAlignment.Center;
//设置字体前背景颜色
style.FillForegroundColor = HSSFColor.LightBlue.Index;
style.FillPattern = FillPattern.SolidForeground;
//设置单元格边框大小和边框前背景颜色
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BottomBorderColor = HSSFColor.Black.Index;
style.LeftBorderColor = HSSFColor.Black.Index;
style.RightBorderColor = HSSFColor.Black.Index;
style.TopBorderColor = HSSFColor.Black.Index;
//创建一个字体样式对象
IFont font = workbook.CreateFont();
//设置字体
font.FontName = "宋体";
//设置字体尺寸(字号)
font.FontHeightInPoints = 10;
//设置字体加粗样式
font.Boldweight = (short)FontBoldWeight.Bold;
//设置字体颜色
font.Color = HSSFColor.White.Index;
//设置字体样式
style.SetFont(font);


这里定义好单元格样式之后,把样式赋值给单元格:
headerRow.GetCell(0).CellStyle = style;//这里意思是获取行第一个单元格赋样式

2。完整代码:

public static class NPOIHelper
{
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dataSet">数据集</param>
/// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="isAddStyle">是否添加固定单元格样式</param>
/// <param name="errMsg">异常消息</param>
/// <param name="styleDic">单元格样式字典:
/// Alignment(水平对齐);
/// Background(单元格背景颜色);
/// Border:单元格边框粗细;
/// FontName:字体名称;
/// FontSize:字体大小;
/// FontWeight:字体是否加粗;
/// FontColor:字体颜色;
/// </param>
/// <returns>成功或失败</returns>
public static bool ExportDataToExcel(DataSet dataSet, string absolutePath, bool isAddStyle, out string errMsg)
{
errMsg = string.Empty;
List<DataTable> dts = new List<DataTable>();
foreach (DataTable dt in dataSet.Tables)
{
dts.Add(dt);
};
return ExportDataToExcel(dts, absolutePath, isAddStyle, out errMsg);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dataTable">数据表格</param>
/// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="isAddStyle">是否添加固定单元格样式</param>
/// <param name="errMsg">异常消息</param>
/// <returns>成功或失败</returns>
public static bool ExportDataToExcel(DataTable dataTable, string absolutePath, bool isAddStyle, out string errMsg)
{
errMsg = string.Empty;
List<DataTable> dts = new List<DataTable>();
dts.Add(dataTable);
return ExportDataToExcel(dts, absolutePath, isAddStyle, out errMsg);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dataTables">数据表格</param>
/// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="isAddStyle">是否添加固定单元格样式</param>
/// <param name="errMsg">异常消息</param>
/// <returns>成功或失败</returns>
public static bool ExportDataToExcel(IEnumerable<DataTable> dataTables, string absolutePath, bool isAddStyle, out string errMsg)
{
bool result = true;
errMsg = "导出Excel成功";
try
{
IWorkbook workbook = null;
string fileEx = Path.GetExtension(absolutePath);
switch (fileEx)
{
case ".xls":
workbook = new HSSFWorkbook();
break;
default:
workbook = new XSSFWorkbook();
break;
}
int i = 0;
foreach (DataTable dt in dataTables)
{
//创建工作簿名称
string sheetName = string.IsNullOrEmpty(dt.TableName)
? "Sheet " + (++i).ToString()
: dt.TableName;
ISheet sheet = workbook.CreateSheet(sheetName);
//所有单元格列宽度
sheet.DefaultColumnWidth = 3 * 5;
//创建列
IRow headerRow = sheet.CreateRow(0);
//第一列的高度
headerRow.Height = 30 * 17;
//赋值头部单元格样式
ICellStyle headerCellStyle = isAddStyle == true ? SetHeaderCellStyle(workbook) : workbook.CreateCellStyle();
//自动转行
headerCellStyle.WrapText = true;
for (int j = 0; j < dt.Columns.Count; j++)
{
string columnName = string.IsNullOrEmpty(dt.Columns[j].ColumnName)
? "Column " + j.ToString()
: dt.Columns[j].ColumnName;
//设置列名称
headerRow.CreateCell(j).SetCellValue(columnName);
//将定义样式赋给单元格
headerRow.GetCell(j).CellStyle = headerCellStyle;
}

//赋值头部单元格样式
ICellStyle otherCellStyle = isAddStyle == true ? SetOtherCellStyle(workbook) : workbook.CreateCellStyle();
//自动转行
otherCellStyle.WrapText = true;
//创建行单元格并赋值
for (int k = 0; k < dt.Rows.Count; k++)
{
//第N行
DataRow dr = dt.Rows[k];
IRow row = sheet.CreateRow(k + 1);
//第N行第N单元格
for (int r = 0; r < dt.Columns.Count; r++)
{
row.CreateCell(r).SetCellValue(dr[r] != DBNull.Value ? dr[r].ToString() : string.Empty);
row.GetCell(r).CellStyle = otherCellStyle;
}
}
}
using (FileStream fs = File.Create(absolutePath))
{
workbook.Write(fs);
}
}
catch (Exception ex)
{
result = false;
errMsg = ex.Message;
}
return result;
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="htColumns">要导出的列数据</param>
/// <param name="dataSet">导出Excel数据</param>
/// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="msg">输出消息</param>
/// <returns>成功或失败</returns>
public static bool ExportDataToExcel(Dictionary<string, string> dicColumns, DataSet dataSet, string absolutePath, out string msg)
{
return ExportDataToExcel(dicColumns, dataSet.Tables[0], absolutePath, out msg);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="htColumns">要导出的列数据</param>
/// <param name="dataTable">导出Excel数据</param>
/// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="msg">输出消息</param>
/// <returns>成功或失败</returns>
public static bool ExportDataToExcel(Dictionary<string, string> dicColumns, DataTable dataTable, string absolutePath, out string msg)
{
bool result = true;
msg = "导出Excel成功";
try
{
#region 实例化Nopi工作簿对象
IWorkbook workbook = null;
string fileEx = Path.GetExtension(absolutePath);
switch (fileEx)
{
case ".xls":
workbook = new HSSFWorkbook();
break;
default:
workbook = new XSSFWorkbook();
break;
}
#endregion

#region 构建列
//创建工作簿名称
string sheetName = dataTable.TableName;
ISheet sheet = workbook.CreateSheet(sheetName);
//所有单元格列宽度
sheet.DefaultColumnWidth = 3 * 5;
//创建列
IRow headerRow = sheet.CreateRow(0);
//第一列的高度
headerRow.Height = 30 * 17;
//赋值头部单元格样式
ICellStyle headerCellStyle = SetHeaderCellStyle(workbook);
//自动转行
headerCellStyle.WrapText = true;
int i = 0;
foreach (var columns in dicColumns)
{
headerRow.CreateCell(i).SetCellValue(columns.Value.ToString());
//将定义样式赋给单元格
headerRow.GetCell(i).CellStyle = headerCellStyle;
i++;
}
#endregion

#region 构建行
//赋值头部单元格样式
ICellStyle otherCellStyle = SetOtherCellStyle(workbook);
//自动转行
otherCellStyle.WrapText = true;
int j = 0;
//创建行单元格并赋值
foreach (DataRow dataRow in dataTable.Rows)
{
//第N行
DataRow dr = dataTable.Rows[j];
IRow row = sheet.CreateRow(j + 1);
int k = 0;
foreach (var columns in dicColumns)
{
row.CreateCell(k).SetCellValue(dr[columns.Key.ToString()] != DBNull.Value ? dr[columns.Key.ToString()].ToString() : string.Empty);
row.GetCell(k).CellStyle = otherCellStyle;
k++;
}
j++;
}
#endregion

#region 其他
using (FileStream fs = File.Create(absolutePath))
{
workbook.Write(fs);
}
#endregion
}
catch (Exception ex)
{
result = false;
msg = ex.Message;
}
return result;
}
/// <summary>
/// 获取Excel数据
/// </summary>
/// <param name="absolutePath">Excel绝对路径(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param>
/// <param name="errMsg">异常消息</param>
/// <returns>数据表格</returns>
public static DataSet GetDataSetByExcel(string absolutePath, out string errMsg)
{
errMsg = "获取Excel数据成功";
DataSet ds = new DataSet();
List<DataTable> dtList = new List<DataTable>();
try
{
if (!File.Exists(absolutePath))
throw new FileNotFoundException("文件不存在");
Stream stream = new MemoryStream(File.ReadAllBytes(absolutePath));
IWorkbook workbook = null;
string fileEx = Path.GetExtension(absolutePath);
switch (fileEx)
{
case ".xls":
workbook = new HSSFWorkbook(stream);
break;
default:
workbook = new XSSFWorkbook(stream);
break;
}
for (int i = 0; i < workbook.NumberOfSheets; i++)
{
DataTable dt = new DataTable();
dt.TableName = string.Format("Sheet{0}", i + 1);
ISheet sheet = workbook.GetSheetAt(i);
IRow headerRow = sheet.GetRow(0);

int cellCount = headerRow.LastCellNum;
for (int j = headerRow.FirstCellNum; j < cellCount; j++)
{
DataColumn column = new DataColumn(headerRow.GetCell(j).StringCellValue);
dt.Columns.Add(column);
}
int rowCount = sheet.LastRowNum;
for (int a = (sheet.FirstRowNum + 1); a < rowCount; a++)
{
IRow row = sheet.GetRow(a);
if (row == null) continue;

DataRow dr = dt.NewRow();
for (int b = row.FirstCellNum; b < cellCount; b++)
{
if (row.GetCell(b) == null) continue;
dr[b] = row.GetCell(b).ToString();
}

dt.Rows.Add(dr);
}
dtList.Add(dt);
}
stream.Close();
foreach (DataTable dt in dtList)
{
ds.Tables.Add(dt);
}
}
catch (Exception ex)
{
errMsg = ex.Message;
}
return ds;
}
/// <summary>
/// 设置头部样式
/// </summary>
/// <param name="workbook">工作簿对象</param>
/// <returns></returns>
private static ICellStyle SetHeaderCellStyle(IWorkbook workbook)
{
//创建单元格样式对象
ICellStyle style = workbook.CreateCellStyle();
//垂直对齐居中
style.VerticalAlignment = VerticalAlignment.Center;
//水平对齐居中
style.Alignment = HorizontalAlignment.Center;
//设置字体前背景颜色
style.FillForegroundColor = HSSFColor.LightBlue.Index;
style.FillPattern = FillPattern.SolidForeground;
//设置单元格边框大小和边框前背景颜色
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BottomBorderColor = HSSFColor.Black.Index;
style.LeftBorderColor = HSSFColor.Black.Index;
style.RightBorderColor = HSSFColor.Black.Index;
style.TopBorderColor = HSSFColor.Black.Index;
//创建一个字体样式对象
IFont font = workbook.CreateFont();
//设置字体
font.FontName = "宋体";
//设置字体尺寸(字号)
font.FontHeightInPoints = 10;
//设置字体加粗样式
font.Boldweight = (short)FontBoldWeight.Bold;
//设置字体颜色
font.Color = HSSFColor.White.Index;
//设置字体样式
style.SetFont(font);
return style;
}
/// <summary>
/// 设置其他单元格(除头部以下)样式
/// </summary>
/// <param name="workbook">工作簿对象</param>
/// <returns></returns>
private static ICellStyle SetOtherCellStyle(IWorkbook workbook)
{
//创建其他单元格样式对象
ICellStyle otherCellStyle = workbook.CreateCellStyle();
//设置单元格边框大小和边框前背景颜色
otherCellStyle.BorderBottom = BorderStyle.Thin;
otherCellStyle.BorderLeft = BorderStyle.Thin;
otherCellStyle.BorderRight = BorderStyle.Thin;
otherCellStyle.BorderTop = BorderStyle.Thin;
otherCellStyle.BottomBorderColor = HSSFColor.Black.Index;
otherCellStyle.LeftBorderColor = HSSFColor.Black.Index;
otherCellStyle.RightBorderColor = HSSFColor.Black.Index;
otherCellStyle.TopBorderColor = HSSFColor.Black.Index;
//创建一个字体样式对象
IFont otherCellFont = workbook.CreateFont();
//设置字体
otherCellFont.FontName = "宋体";
//设置字体尺寸(字号)
otherCellFont.FontHeightInPoints = 9;
//设置字体样式
otherCellStyle.SetFont(otherCellFont);
return otherCellStyle;
}
/// <summary>
/// 组合Excel数据与数据库数据
/// </summary>
/// <param name="outputDS">要合并的与合并后输出的数据集</param>
/// <param name="byDS">要合并的数据集</param>
/// <returns>数据集</returns>
public static DataSet CombinedDataByDataSet(DataSet outputDS, DataSet byDS)
{
if (null != byDS && byDS.Tables.Count > 0)
{
DataRowCollection byDr = byDS.Tables[0].Rows;
int cLen = byDS.Tables[0].Columns.Count;
foreach (DataRow dr in byDr)
{
DataRow outputDr = outputDS.Tables[0].NewRow();
for (int i = 0; i < cLen; i++)
{
outputDr[i] = dr[i];
}
outputDS.Tables[0].Rows.Add(outputDr);
}
}
return outputDS;
}
/// <summary>
/// list转变为DataSet
/// </summary>
/// <typeparam name="T">T型结构</typeparam>
/// <param name="data">List数据</param>
/// <returns>DataSet</returns>
public static DataSet ToDataSet<T>(IList<T> data)
{
DataSet result = new DataSet();
DataTable dataTable = new DataTable();
if (data.Count > 0)
{
PropertyInfo[] propertys = data[0].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
dataTable.Columns.Add(pi.Name, pi.PropertyType);
}
for (int i = 0; i < data.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
object obj = pi.GetValue(data[i], null);
tempList.Add(obj);
}
object[] array = tempList.ToArray();
dataTable.LoadDataRow(array, true);
}
}
result.Tables.Add(dataTable);
return result;
}
/// <summary>
/// list转变为DataTable
/// </summary>
/// <typeparam name="T">T型结构</typeparam>
/// <param name="data">List数据</param>
/// <returns>DataTable</returns>
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable dt = new DataTable();
for (int i = 0; i < properties.Count; i++)
{
PropertyDescriptor property = properties[i];
dt.Columns.Add(property.Name, property.PropertyType);
}
object[] values = new object[properties.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = properties[i].GetValue(item);
}
dt.Rows.Add(values);
}
return dt;
}
}


里面方法有根据Excel导出数据和根据数据导出Excel.由于自己也是因为近段时间功能开发需要而去学习的,方法并不是十分完整,希望诸位多多指导。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: