npoi获取合并单元格_梦琪⼩⽣C#如何使⽤NPOI操作Excel以
及读取合并单元格等
C#操作Excel⽅法有很多,以前⽤的需要电脑安装office才能⽤,但因为版权问题公司不允许安装office。所以改⽤NPOI进⾏Excel操作,基本上⼀些简单的Excel操作都没有问题,读写合并单元格等都能实现。
命名空间:
using NPOI;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
简单的保存数据:
public void ExcelTest(string path)
{
IWorkbook workbook = new HSSFWorkbook();//创建Workbook
workbook.CreateSheet("sheet1");//创建sheet
using (FileStream fs = File.Create(path))//path=mmm.xls;
{
ISheet sheet = workbook.GetSheetAt(0);//获取sheet
sheet.CreateRow(1).CreateCell(0).SetCellValue("nami");//创建第⼀⾏/创建第⼀单元格/设置第⼀单元格的内容[可以分开创建,但必须先创建⾏才能创建单元格不然报错]
sheet.GetRow(1).CreateCell(1).SetCellValue("robin");//获取第⼀⾏/创建第⼆单元格/设置第⼆单元格的内容
sheet.CreateRow(2).CreateCell(0).SetCellValue("saber");//创建第⼆⾏/创建第⼀单元格/设置第⼀单元格的内容
sheet.GetRow(2).CreateCell(1).SetCellValue("luffy");//获取第⼆⾏/创建第⼆单元格/设置第⼆单元格的内容
sheet.GetRow(1).CreateCell(2).SetCellValue(5);
sheet.GetRow(2).CreateCell(2).SetCellValue(2);
//添加批注
IDrawing draw = sheet.CreateDrawingPatriarch();
IComment comment = draw.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 1, 2, 4, 4));//⾥⾯参数应该是指⽰批注的位置⼤⼩吧
comment.String = new HSSFRichTextString("one-piece");//添加批注内容
comment.Author = "梦琪⼩⽣";//添加批注作者
sheet.GetRow(1).GetCell(1).CellComment = comment;//将之前设置的批注给定某个单元格
//单元格格式设置
ICellStyle cellStyle = workbook.CreateCellStyle();
IDataFormat format = workbook.CreateDataFormat();
cellStyle.DataFormat = format.GetFormat("0.00");
sheet.GetRow(2).GetCell(2).CellStyle = cellStyle;
//合并单元格
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 2));
sheet.CreateRow(0).CreateCell(0).SetCellValue("梦琪⼩⽣");
ICellStyle titleStyle = workbook.CreateCellStyle();
IFont titleFont = workbook.CreateFont();
titleFont.FontHeightInPoints = 15;//设置字体⼤⼩
titleFont.Color = HSSFColor.BLUE.index;//设置字体颜⾊
titleStyle.SetFont(titleFont);
titleStyle.Alignment = HorizontalAlignment.CENTER;//居中
sheet.GetRow(0).GetCell(0).CellStyle = titleStyle;
ICellStyle style = workbook.CreateCellStyle();
style.BorderBottom = BorderStyle.THIN;
style.BorderLeft = BorderStyle.THIN;
style.BorderRight = BorderStyle.THIN;
style.BorderTop = BorderStyle.THIN;
sheet.GetRow(1).GetCell(1).CellStyle = style;
//插⼊图⽚
HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 0, 0, 0, 5, 6, 10);
byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\Administrator\Desktop\image\mqxs.png"); int picID = workbook.AddPicture(bytes, PictureType.PNG);
IPicture pic = patriarch.CreatePicture(anchor2, picID);
pic.Resize();
workbook.Write(fs);//保存⽂件
}
}
读取Excel返回DataTable:
///
/// 读取Excel[.xls](返回DataTable)
///
/// Excel路径
///
public static DataTable ReadExcel(string path)
{
try
{
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(path, FileMode.Open))
{
IWorkbook workbook = new HSSFWorkbook(fs);
vertical怎么读ISheet sheet = workbook.GetSheetAt(0);
int rfirst = sheet.FirstRowNum;
int rlast = sheet.LastRowNum;
IRow row = sheet.GetRow(rfirst);
int cfirst = row.FirstCellNum;
int clast = row.LastCellNum;
for (int i = cfirst; i < clast; i++)
{
if (row.GetCell(i) != null)
dt.Columns.Add(row.GetCell(i).StringCellValue, System.Type.GetType("System.String")); }
row = null;
for (int i = rfirst + 1; i <= rlast; i++)
{
DataRow r = dt.NewRow();
IRow ir = sheet.GetRow(i);
for (int j = cfirst; j < clast; j++)
{
if (ir.GetCell(j) != null)
{
r[j] = ir.GetCell(j).ToString();
}
}
dt.Rows.Add(r);
ir = null;
r = null;
}
sheet = null;
workbook = null;
}
return dt;
}
catch
{
System.Windows.Forms.MessageBox.Show("Excel格式错误或者Excel正由另⼀进程在访问");
return null;
}
}
Ok,NPOI也⽤了⼀段时间了....
讲⼀点经验之谈...关于NPOI的单元格样式CellStyles个数是有限制的4000个,所以⼤家设置单元格样式的时候尽量不要再for循环⾥⾯定义,可以在for循环外围定义好使⽤...减少CellStyles个数,Ok,主要要讲的是下⾯的那⼀条....
((HSSFSheet)sheet).SetEnclosedBorderOfRegion(new NPOI.SS.Util.CellRangeAddress(0, 50, 0, 100), BorderStyle.MEDIUM, HSSFColor.BLACK.index);
这句的功能是给合并后的单元格加外边框。
⽐如这条语句的意思是将单元格0⾏0列到50⾏100列绘制⼀个整体的外边框。⽤到是很好⽤...但是很占资源,不知道为什么就这么⼀句话会占好⼏个⽽且速度较慢....
所以这个功能在数据量⼩的可以⽤,问题不⼤,速度基本影响也不⼤,但数据量⼀⼤...这个相对就会拖累速度了⼜太占资源.
⼩⽣我就在这边吃过亏,就是这条语句导致CellStyles个数不够⽤[当然不是⼀句就会有问题咯....因为很多地⽅合并单元格然后加外边框...最终就悲剧了....]....⼩⽣觉得这是NPOI的缺陷...
NPOI操作Excel使⽤说明:
2017/05/05补充:
C# Color转NPOI颜⾊:
///
/// 获取颜⾊值
///
/// 颜⾊RGB
/// Excel画布
///
public static short GetColorIndex(this HSSFWorkbook workbook,Color color)
{
HSSFPalette palette = workbook.GetCustomPalette();
var v = palette.FindSimilarColor(color.R, color.G, color.B);
if (v == null)
{
throw new Exception("Color is not in Palette");
}
else return v.GetIndex();
}
2018/4/8补充:
获取合并单元格
/
//
/// 获取当前单元格所在的合并单元格的位置
///
/// sheet表单
/// ⾏索引 0开始
/// 列索引 0开始
/// 合并单元格左上⾓坐标
/// 合并单元格右下⾓坐标
/// 返回false表⽰⾮合并单元格
private static bool IsMergeCell(ISheet sheet, int rowIndex, int colIndex, out Point start, out Point end)
{
bool result = false;
start = new Point(0, 0);
end = new Point(0, 0);
if ((rowIndex < 0) || (colIndex < 0)) return result;
int regionsCount = sheet.NumMergedRegions;
for (int i = 0; i < regionsCount; i++)
{
CellRangeAddress range = sheet.GetMergedRegion(i);
//sheet.IsMergedRegion(range);
if (rowIndex >= range.FirstRow && rowIndex <= range.LastRow && colIndex >= range.FirstColumn && colIndex <= range.LastColumn)
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论