Npoi操作Excel
1.读取Excel的多个sheet到DataSet里面
public DataSet GetDataSetFromExcel(string path) { DataSet set = new DataSet(); FileStream fs; try { fs = new FileStream(path, FileMode.Open, FileAccess.Read); } catch (Exception) { // MessageBox.Show("文件被其他程序占用,请先关闭"); return set; } bool isCompatible = GetIsCompatible(path); IWorkbook workbook = CreateWorkbook(isCompatible, fs); //获取Excel中有几个sheet int sheetNum = workbook.NumberOfSheets; string sheetName = ""; ///Excel中的一个sheet ISheet sheet = null; int sheetIndex = -1; for (int i = 0; i < sheetNum; i++) { sheetName = workbook.GetSheetName(i); if (int.TryParse(sheetName, out sheetIndex)) { sheet = workbook.GetSheetAt(sheetIndex); } else { sheet = workbook.GetSheet(sheetName); } // 示例的excel 第一行是个大标题,第二行才是标题行,所以下面这个标题行的索引为1 set.Tables.Add(GetDataTableFromSheet(sheet, 1)); } fs.Close(); workbook = null; sheet = null; return set; } /// <summary> /// 从工作表中生成DataTable /// </summary> /// <param name="sheet">sheet 名</param> /// <param name="headerRowIndex">列标题行索引,从0开始</param> /// <returns></returns> private DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex) { DataTable table = new DataTable(); IRow headerRow = sheet.GetRow(headerRowIndex); ///获取excel 的列数 int cellCount = headerRow.LastCellNum; // 根据Sheet为DataTable设置列 for (int i = 0; i < cellCount; i++) { if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") { // 如果遇到第一个空列,则不再继续向后读取 cellCount = i; break; } DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } //if (cellCount != 4) // 如果标的结构不符合要求则提示导入文件错误 //{ // //MessageBox.Show("该Excel数据异常,请确认导入的文件数据是否正确!"); // return null; //} // 获取sheet 的行数 int sheetCount = sheet.LastRowNum; for (int i = (headerRowIndex + 1); i <= sheetCount; i++) { try { // 获取一行 IRow row = sheet.GetRow(i); //如果遇到某行的第一个单元格的值为空,则不再继续向下读取 if (row != null && row.GetCell(0) != null) { // 读取sheet的一行到DataTable里面 DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { dataRow[j] = row.GetCell(j).ToString(); } table.Rows.Add(dataRow); } } catch (Exception) { } } return table; } private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream) { if (isCompatible) { return new HSSFWorkbook(stream); } else { return new XSSFWorkbook(stream); } } private static bool GetIsCompatible(string filePath) { return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase); }
2.读取excel里面的图片
/// <summary> /// 从excel获取图片,由于excel存储图片的机制,只能根据excel中图片插入顺序导出 /// </summary> /// <param name="filepath">文件路径</param> /// <param name="savepath">图片保存路径</param> /// <param name="listPath">返回保存的图表地址list</param> /// <returns>保存图片是否成功</returns> public bool ExcelToImage(string filepath, string savepath, ref List<string> listPath) { if(!Directory.Exists(savepath)) { Directory.CreateDirectory(savepath); } try { using (FileStream fsReader = File.OpenRead(filepath)) { HSSFWorkbook wk = new HSSFWorkbook(fsReader); IList pictures = wk.GetAllPictures(); int i = 0; foreach (HSSFPictureData pic in pictures) { //if (pic.Data.Length == 19504) //跳过不需要保存的图片,其中pic.data有图片长度 // continue; string ext = pic.SuggestFileExtension();//获取扩展名 string path = string.Empty; if (ext.Equals("jpg")) { Image jpg = Image.FromStream(new MemoryStream(pic.Data));//从pic.Data数据流创建图片 path = Path.Combine(savepath, string.Format("pic{0}.jpg", i++)); jpg.Save(path);//保存 } else if (ext.Equals("png")) { Image png = Image.FromStream(new MemoryStream(pic.Data)); path = Path.Combine(savepath, string.Format("pic{0}.png", i++)); png.Save(path); } else if (ext.Equals("jpeg")) { Image png = Image.FromStream(new MemoryStream(pic.Data)); path = Path.Combine(savepath, string.Format("pic{0}.png", i++)); png.Save(path); } if (!string.IsNullOrEmpty(path)) listPath.Add(path); } } } catch (Exception ex) { Console.WriteLine("图片导出异常"); return false; } Console.WriteLine("图片导出成功,共" + listPath.Count +"个图片"); return true; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单