zoukankan      html  css  js  c++  java
  • NPOI新建和读取EXCEL

            //基本NPOI 1.2.5.0
            static void Main(string[] args)
            {
                string path = string.Format("E:\export{0}.xls", DateTime.Now.ToString("yyyyMMddhhmmss"));
    
                WriteAExcel(path);
                ReadAExcel(path);
                Console.ReadKey();
            }
            /// <summary>
            /// 创建测试
            /// </summary>
            /// <param name="path">路径</param>
            static void WriteAExcel(string path)
            {
                //创建工作薄
                HSSFWorkbook workbook = new HSSFWorkbook();
                //创建一个名称为"排班表"的表
                ISheet sheet = workbook.CreateSheet("排班表");
    
                int rowCount = 0;
                int colCount = 6;
    
                //创建一行, 此行为标题行
                IRow title = sheet.CreateRow(rowCount);
                title.CreateCell(0).SetCellValue(string.Format("{0}({1})", "消化内科", "珠海市人民医院"));
    
                //合并单元格
                CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount, 0, colCount - 1);
                sheet.AddMergedRegion(cellRangeAddress);
                rowCount++;
    
                //创建一行, 空行
                sheet.CreateRow(rowCount);
                rowCount++;
    
                //创建一行,此行为第二行
                IRow headerRow = sheet.CreateRow(rowCount);
                rowCount++;
    
                //固定区域, 用于header
                sheet.CreateFreezePane(0, 1);
    
                string[] headerArray = new[] { "医生", "日期", "时间", "预约数", "挂号费", "状态" };
    
                //表头行
                for (int i = 0; i < headerArray.Length; i++)
                {
                    headerRow.CreateCell(i).SetCellValue(headerArray[i]);
                }
    
                List<MyDataItem> dataList = new List<MyDataItem>();
                #region 测试数据
                dataList.Add(new MyDataItem() { ID = 1, DoctorName = "张某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 2, DoctorName = "李某", Date = DateTime.Now, Time = "下午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 3, DoctorName = "赵某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 4, DoctorName = "杨某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "停诊" });
                dataList.Add(new MyDataItem() { ID = 5, DoctorName = "黎某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 6, DoctorName = "张某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 7, DoctorName = "李某", Date = DateTime.Now, Time = "下午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 8, DoctorName = "赵某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 9, DoctorName = "杨某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "停诊" });
                dataList.Add(new MyDataItem() { ID = 10, DoctorName = "黎某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 11, DoctorName = "张某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 12, DoctorName = "李某", Date = DateTime.Now, Time = "下午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 13, DoctorName = "赵某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 14, DoctorName = "杨某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "停诊" });
                dataList.Add(new MyDataItem() { ID = 15, DoctorName = "黎某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 16, DoctorName = "张某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 17, DoctorName = "李某", Date = DateTime.Now, Time = "下午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 18, DoctorName = "赵某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                dataList.Add(new MyDataItem() { ID = 19, DoctorName = "杨某", Date = DateTime.Now, Time = "上午", Place = 3, Fee = 10, Status = "停诊" });
                dataList.Add(new MyDataItem() { ID = 20, DoctorName = "黎某", Date = DateTime.Now, Time = "中午", Place = 3, Fee = 10, Status = "排班" });
                #endregion
    
                //添加下拉选项(序列)
                AddDropdownList1(sheet, rowCount);
    
                //添加下拉选项(指定数据)
                AddDropdownList2(workbook, sheet, rowCount);
    
                //插入数据
                for (int i = 0; i < dataList.Count; i++)
                {
                    MyDataItem item = dataList[i];
                    IRow dataRow = sheet.CreateRow(rowCount);
    
                    dataRow.CreateCell(0).SetCellValue(string.Format("{0}({1})", item.DoctorName, item.ID));
                    dataRow.CreateCell(1).SetCellValue(item.Date.ToString("yyyy/MM/dd"));
                    dataRow.CreateCell(2).SetCellValue(item.Time);
                    dataRow.CreateCell(3).SetCellValue(item.Place);
                    dataRow.CreateCell(4).SetCellValue(item.Fee.ToString("N2"));
                    dataRow.CreateCell(5);//.SetCellValue(item.Status);
                    rowCount++;
                }
    
                //写入文件
                using (MemoryStream ms = new MemoryStream())
                {
                    workbook.Write(ms);
    
                    using (FileStream fs = new FileStream(path, FileMode.Create))
                    {
                        byte[] data = ms.ToArray();
                        fs.Write(data, 0, data.Count());
                    }
                }
            }
            //读测试
            static void ReadAExcel(string path)
            {
                using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    IWorkbook workbook = new HSSFWorkbook(file);
                    ISheet sheet = workbook.GetSheet("排班表");
                    IRow headerRow = sheet.GetRow(2);
    
                    //一行最后一个方格的编号 即总的列数
                    int cellCount = headerRow.LastCellNum;
    
                    //有多少列
                    int rowCount = sheet.LastRowNum;
    
                    //
                    for (int i = 2; i < rowCount; i++)
                    {
                        IRow row = sheet.GetRow(i);
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            Console.Write(" " + row.GetCell(j).ToString());
                        }
                        Console.WriteLine();
                    }
                }
            }
            /// <summary>
            /// 添加下拉框(序列)
            /// </summary>
            /// <param name="sheet"></param>
            /// <param name="start"></param>
            static void AddDropdownList1(ISheet sheet, int start)
            {
                CellRangeAddressList regions = new CellRangeAddressList(start, 65535, 5, 5);
                DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(new string[] { "就诊", "停诊" });
                HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
                sheet.AddValidationData(dataValidate);
            }
    
            /// <summary>
            /// 添加下拉框(单元格)
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="sheet"></param>
            /// <param name="start"></param>
            static void AddDropdownList2(HSSFWorkbook workbook, ISheet sheet, int start)
            {
                ISheet sheet2 = workbook.CreateSheet("a");
                sheet2.CreateRow(0).CreateCell(0).SetCellValue("上午");
                sheet2.CreateRow(1).CreateCell(0).SetCellValue("中午");
                sheet2.CreateRow(2).CreateCell(0).SetCellValue("下午");
                sheet2.CreateRow(3).CreateCell(0).SetCellValue("晚上");
    
                IName range = workbook.CreateName();
                range.RefersToFormula = "a!$A$1:$A$4";
                range.NameName = "timeDic";
    
                CellRangeAddressList regions = new CellRangeAddressList(start, 65535, 2, 2);
                DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("timeDic");
                HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
                //添加约束警告
                dataValidate.CreateErrorBox("输入不合法", "请输入下拉列表中的值。");
                sheet.AddValidationData(dataValidate);
            }
            /// <summary>
            /// 测试数据类型
            /// </summary>
            class MyDataItem
            {
                public int ID { get; set; }
    
                public string DoctorName { get; set; }
    
                public DateTime Date { get; set; }
    
                public string Time { get; set; }
    
                public int Place { get; set; }
    
                public decimal Fee { get; set; }
    
                public string Status { get; set; }
            }

     备忘:

    //2014/10/08
    
    //加粗,15字
    IFont Bold15Font = workbook.CreateFont();
    Bold15Font.Boldweight = (short)FontBoldWeight.BOLD;
    Bold15Font.FontHeightInPoints = 15;
    
    //黄色底,横向居中,纵向居中,加粗,11字, 边框(单个)
    ICellStyle YellowCenterBold11Cell = workbook.CreateCellStyle();
    YellowCenterBold11Cell.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.YELLOW.index;
    YellowCenterBold11Cell.FillPattern = FillPatternType.SOLID_FOREGROUND;
    YellowCenterBold11Cell.Alignment = HorizontalAlignment.CENTER;
    YellowCenterBold11Cell.VerticalAlignment = VerticalAlignment.CENTER;
    YellowCenterBold11Cell.SetFont(Bold11Font);
    YellowCenterBold11Cell.BorderBottom = BorderStyle.THIN;
    YellowCenterBold11Cell.BorderLeft = BorderStyle.THIN;
    YellowCenterBold11Cell.BorderRight = BorderStyle.THIN;
    YellowCenterBold11Cell.BorderTop = BorderStyle.THIN;
    
    //给合并单元格加边框
    CellRangeAddress cellRangeAddress0 = new CellRangeAddress(0, 0, 0, 3);
    sheet.AddMergedRegion(cellRangeAddress0);
     ((HSSFSheet)sheet).SetEnclosedBorderOfRegion(cellRangeAddress0, BorderStyle.THIN, NPOI.HSSF.Util.HSSFColor.BLACK.index);
    
    //单元格宽
    sheet.SetColumnWidth(0, 10 * 256);
    
    //行高
    row0.HeightInPoints = Height25;
    //2014/10/09
    ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1"); IRow row1 = sheet1.CreateRow(0); ICell cel1 = row1.CreateCell(0); ICell cel2 = row1.CreateCell(1); ICellStyle unlocked = hssfworkbook.CreateCellStyle(); unlocked.IsLocked = false; ICellStyle locked = hssfworkbook.CreateCellStyle(); locked.IsLocked = true;//确定当前单元格被设置保护 cel1.SetCellValue("没被锁定"); cel1.CellStyle = unlocked; cel2.SetCellValue("被锁定"); cel2.CellStyle = locked; sheet1.ProtectSheet("password");//设置密码保护
    sheet1.AutoSizeColumn(i);//自动宽度(不支持中文)
    
    

    自动宽度( 支持中文)

         /// <summary>
            /// 自动宽度支持中文
            /// </summary>
            public static void AutoSizeColumnExtension(this ISheet sheet, int maxColumn)
            {
    
                for (int i = 0; i < maxColumn; i++)
                {
                    sheet.AutoSizeColumn(i);
                }
    
                //获取当前列的宽度,然后对比本列的长度,取最大值  
                for (int columnNum = 0; columnNum < maxColumn; columnNum++)
                {
                    int columnWidth = sheet.GetColumnWidth(columnNum) / 256;
                    for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++)
                    {
                        IRow currentRow;
                        //当前行未被使用过  
                        if (sheet.GetRow(rowNum) == null)
                        {
                            currentRow = sheet.CreateRow(rowNum);
                        }
                        else
                        {
                            currentRow = sheet.GetRow(rowNum);
                        }
    
                        if (currentRow.GetCell(columnNum) != null)
                        {
                            ICell currentCell = currentRow.GetCell(columnNum);
                            int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
                            if (columnWidth < length)
                            {
                                columnWidth = length;
                            }
                        }
                    }
                    sheet.SetColumnWidth(columnNum, (columnWidth > 255 ? 255 : columnWidth) * 256);
                }
            }

    更多可以查看官方手册:http://tonyqus.sinaapp.com/

  • 相关阅读:
    R语言 ggplot2包
    C++实现景区信息管理系统
    linux系统目录介绍
    Python中的赋值、深拷贝与浅拷贝(内存地址)
    三大相关系数: pearson, spearman, kendall(python示例实现)
    Xshell删除键不好使:删除显示退格^H
    Spark SQL中出现 CROSS JOIN 问题解决
    Python apply函数
    Python Dataframe 分组排序和 Modin
    Python 中的时间处理包datetime和arrow
  • 原文地址:https://www.cnblogs.com/xachary/p/3986086.html
Copyright © 2011-2022 走看看