zoukankan      html  css  js  c++  java
  • java操作excel

    2013-10-10 09:09:01 

     一.excel操作简介:java操作excel有POI和JXL两种方式
       1.性能比较:POI的效率和稳定性比JXL高
       2.功能比较:POI对excel中的公式支持比JXL好
       3.环境支持:POI支持jdk1.5而jxl只支持jdk1.6或以上且不能在webShpere下运行
       4.使用选择:POI
    二.POI:
       1.POI简介:POI可用两种模式(用户模式和事件用户模式)读取文件,使用POI时JVM最好设置为-Xms512m -Xmx1024m否则会很影响性能
         (1).用户模式以DOM方式读取文件,其一次性将文件加载到内存所以内存占用大,不适合读取大数据量的文件,但读取操作方便
         (2).事件用户模式以SAX方式读取文件,其每次只读取陪份数据所以内存占用少,适合用于读取大数据量的文件,但读操作不方便
       2.创建简单的excel文件对象并输出

         (1).创建一个无任何内容的excel工作表:HSSFWorkbook workBook = new HSSFWorkbook();
         (2).在已创建的excel工作表对象中创建一个图表:HSSFSheet sheet = HSSFWorkbook对象.createSheet();
         (3).在已创建的图表中创建行:HSSFRow row = HSSFSheet对象.createRow((short)从0开始的行号);
         (4).在已创建的行中创建单元格:HSSFCell cell = HSSFRow对象.createCell((short)从0开始的列号);
         (5).将创建和设置好的工作表输出到硬盘:HSSFWorkbook对象.write(new FileOutputStream("保存的路径+文件名"));
       3.读取excel文件

       (1).以文件输入流对象获取工作表对象:HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("文件路径"));
         (2).用已获取的工作表对象获取指定的图表对象:HSSFSheet sheet = HSSFWorkbook对象.getSheetAt(int 指定图表的索引);
         (3).用已获取的图表对象获取指定的行:HSSFRow row = HSSFSheet对象.getRow(int 指定行的索引);
         (4).用已获取的行对象获取指定的单元格:HSSFCell cell = HSSFRow对象.getCell((short) 指定的单元格索引);
         (5).获取单元格中的值:
             ①.先判断当前单元格的数据类型:HSSFCell对象.getCellType() == 正整数/HSSFCell.CELL_TYPE_DataType
             ②.根据单元格的数据类型获取相应的数据:
                HSSFCell对象.getStringCellValue(); //获取String型单元格的数据
                HSSFCell对象.getNumericCellValue(); //获取数值类型单元格的内容
         如果当前单元格的数据类型是公式(HSSFCell.CELL_TYPE_FORMULA)则先将该单元格的数据类型设置为数值型(HSSFCell对象.setCellType(0/HSSFCell.CELL_TYPE_NUMERIC))再用获取数值型单元格的方式获取值
                如果单元格的数据是超长的数值性,则按下面方式获取:
      if (HSSFDateUtil.isCellDateFormatted(cell)) {
       double d = cell.getNumericCellValue();
       Date date = HSSFDateUtil.getJavaDate(d);
       SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
       value = sf.format(date);
      } else {
       long cellData = (long) cell.getNumericCellValue();
       if (cellData == cell.getNumericCellValue()) {
        value = String.valueOf(cellData);
       } else {
        value = String.valueOf(cell.getNumericCellValue()).trim();
       }
      }

       4.修改/设置execl

         (1).基本设置
             HSSFRow对象.setHeight((short)上百的行高值); //设置行高
             HSSFRow对象.setRowHeight(2); //设置行高
             HSSFSheet对象.setColumnWidth((short)列索引,(short)上百的列宽值); //设置列宽
             HSSFCell对象.setCellType(HSSFCell.CELL_TYPE_DataType/正整数(0:int型,1:String型...)); //设置单元格的数据类型
             Region region = new Region((short)开始行索引,(short)开始列索引,(short)结束行索引,(short)结束列索引); //创建一个从"开始行索引"和"开始列索引"到"结束行索引"和"结束列索引"的单元格合并对象
             HSSFSheet对象.addMergedRegion(Region对象); //合并单元格
             HSSFSheet对象.getNumMergedRegions(); //获得所有区域
             HSSFWorkbook对象.setPrintArea(0, "$A$1:$C$2"); //设置打印区域
         (2).单元格设置:
      ①.基本设置
                HSSFCell对象.setCellValue("cellValue"); //给单元格设置内容
         HSSFCell对象.setCellStyle(cellStyle对象); //给单元格设置样式
         HSSFCell对象.setEncoding((short) 1); //给单元格设置编码(0:英文编码,1:中文编码)
      ②.字体设置:HSSFFont ft = HSSFWorkbook对象.createFont(); //创建字体对象,在将字体对象传入HSSFCellStyle对象.setFont()方法中
                HSSFFont对象.setFontHeightInPoints((short) 字号数); //设置字号
                HSSFFont对象.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗字体
                HSSFFont对象.setColor(HSSFColor.RED.index); //设置字体颜色
      ③.样式设置:HSSFCellStyle style = HSSFWorkbook对象.createCellStyle()/HSSFCell对象.getCellStyle(); //创建/获得单元格样式
                HSSFCellStyle对象.setFont(HSSFFont对象); //设置字体风格
         HSSFCellStyle对象.setWrapText(true); //设置自动换行
                HSSFCellStyle对象.setBorderTop(HSSFCellStyle.BORDER_THIN); //上边框
                HSSFCellStyle对象.setBorderBottom(HSSFCellStyle.BORDER_DOTTED/HSSFCellStyle.BORDER_THIN); //下边框
                HSSFCellStyle对象.setBorderLeft(HSSFCellStyle.BORDER_DOTTED); //左边框
                HSSFCellStyle对象.setBorderRight(HSSFCellStyle.BORDER_THIN); //右边框
                HSSFCellStyle对象.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置单元格内容左右居中
                HSSFCellStyle对象.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //设置单元格内容上下居中
                HSSFCellStyle对象.setRotation(short rotation); //设置单元格内容旋转rotation度
                HSSFCellStyle对象.setFillForegroundColor(HSSFColor.LIME.index/HSSFColor.ORANGE.index); //设置单元格前景色(注:一定要指定填充方式),前景色并非字体颜色
                HSSFCellStyle对象.setFillBackgroundColor(HSSFColor.AQUA.index); //设置单元格背景色,如果要同时设置前景色和背景色要先设置前景色,(注:一定要指定填充方式)
                HSSFCellStyle对象.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND/HSSFCellStyle.BIG_SPOTS);

                HSSFCell对象.setCellStyle(HSSFCellStyle);
         (3).图表设置
             HSSFSheet对象.createFreezePane(int 垂直线线标,int 水平线线标); //设置窗口冻结
             HSSFSheet对象.setSelected(true); //设置默认选中哪个图表
             HSSFSheet对象.setZoom(1,2); //50 percent magnification 设置图表的尺寸
      HSSFSheet对象.setSheetName(图表索引,"名称",编码(HSSFCell.ENCODING_UTF_16)); //设置图表名
             sheet.shiftRows(5, 10, -5); //清空行数据,调整行位置
         (4).页眉页脚设置
             HSSFHeader header = HSSFSheet对象.getHeader(); //得到页眉对象
             HSSFHeader对象.setCenter("Center Header");
             HSSFHeader对象.setLeft("Left Header");
             HSSFHeader对象.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");

             HSSFFooter footer = HSSFSheet对象.getFooter(); //得到页脚对象
             HSSFFooter对象.setCenter("Center Header");
             HSSFFooter对象.setLeft("Left Header");
             HSSFFooter对象.setRight("Page"+HSSFFooter.page()+"of"+HSSFFooter.numPages());
         (5).调整工作表位置
             HSSFPrintSetup ps = HSSFSheet对象.getPrintSetup();
             HSSFSheet对象.setAutobreaks(true);
             HSSFPrintSetup对象.setFitHeight((short)1);
             HSSFPrintSetup对象.setFitWidth((short)1);
         (6).插入图片
             ①.先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
                ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));
                ImageIO.write(bufferImg,"jpg",byteArrayOut);
      ②.将图片写入excel
         HSSFPatriarch patriarch = HSSFSheet对象.createDrawingPatriarch();
         HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);           
         HSSFPatriarch对象.createPicture(HSSFClientAnchor对象,HSSFWorkbook对象.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
        5.poi的常用方法
          HSSFWorkbook对象.getNumberOfSheets(); //获取工作表中的图表数
          int rowCount = HSSFSheet对象.getLastRowNum()/getPhysicalNumberOfRows(); //获取图表中的行数
          int colCount = HSSFRow对象.getLastCellNum(); //获取当前行的列数
          int firstRowNum = HSSFSheet对象.getFirstRowNum(); //获取第一行行号
          POI中单元格的数据类型的枚举值:
            HSSFCell.CELL_TYPE_NUMERIC //数值型
            HSSFCell.CELL_TYPE_STRING //字符串型
            HSSFCell.CELL_TYPE_FORMULA //公式型
            HSSFCell.CELL_TYPE_BLANK //空值
            HSSFCell.CELL_TYPE_ERROR //故障
    三.JXL:
       1.创建简单excel文件对象并输出
         (1).以文件/输入流对象新建工作表对象:WritableWorkbook workbook = Workbook.createWorkbook(new File("输出路径+文件名.xls")/inputStream);
         (2).用已新建的工作表对象创建图表对象:WritableSheet sheet = workbook.createSheet("sheetName", pageNumber); //用工作表对象新建指定名称和页数的图表对象
         (3).实例化(新建)单元格对象:
             模式1.实例化保存字符串的单元格对象:Label label = new Label(rowNumber,columnNumber,"content",[WritableCellFormat对象]); //以指定的单元格(前两个参数)、内容(第三个参数)及单元格格式化对象创建单元格对象
             模式2.实例化保存数字的单元格对象:jxl.write.Number number = new jxl.write.Number(rowNumber,columnNumber,number,[WritableCellFormat对象]); //以指定单元格(前两个参数)、内容(第三个参数)及单元格格式化对象创建一个保存数字的单元格对象(必须使用Number的完整包路径,否则有语法歧义)
             模式3.实例化保存日期的单元格对象:jxl.write.DateTime dt = new jxl.write.DateTime(rowNumber,columnNumber,dateObject,[WritableCellFormat对象]);
         (4).将创建好的单元格添加到图表中:sheet.addCell(Label/Number对象); //将创建好的单元格添加到图表中
         (5).将工作表输出:workbook.write(); //将工作表对象写到指定路径中
      workbook.close(); //关闭workbook输出流,释放所占用的内存
       2.读取excel文件
         (1).以现有文件/输入流获取工作表对象:Workbook workbook = Workbook.getWorkbook(new File("文件路径")/inputStream); //以指定文件/输入流对象获取工作表对象
         (2).用已获取的工作表对象获取图表对象:Sheet sheet = workbook.getSheet(0); //用已获取的工作表对象获取指定页数的图表对象
             ①.sheet.getRows(); //获取图表中的行数
             ②.sheet.getColumns(); //获取图表中的列数
         sheet.getName(); //获取图表名
             ③.workbook.getNumberOfSheets(); //获取工作表中的图表个数
             ④.Sheet[] sheets = workbook.getSheets(); //获取工作表中的所有图表对象
         Cell[] cells = sheet.getColumn(0); //获取指定列的所有单元格
         Cell[] cells = sheet.getRow(0); //获取指定行的所有单元格
         Cell cell = sheet.getCell(0,0); //获取指定单元格的对象引用(第一个参数是列数,第二个参数是行数)
         (3).用已获取的图表对象获取单元格对象后再获取单元格中的数据:
             方案1.获取总的单元格对象:Cell cell = sheet.getCell(0,0); //用已获取的图表对象获取指定行数和列数的单元格对象
             String result = cell.getContents(); //获取单元格中的内容
             方案2.获取字符串型单元格对象:LabelCell labelCell = (LabelCell)sheet.getCell(0,0);
          String result = labelCell.getString(); //获取单元格中的内容
             方案3.获取数字型单元格对象:NumberCell numberCell = (NumberCell)sheet.getCell(0,0);
        String result = numberCell.getValue(); //获取单元格中的内容
             方案4.获取日期型单元格对象:DateCell dateCell = (DateCell)sheet.getCell(0,0);
        String result = dateCell.getDate(); //获取单元格中的内容
             ①.CellType.LABEL/NUMBER/DATE; //获取系统常量所属的数据类型
             ②.cell.getType(); //获取单元格中数据的类型,一般用于与CellType.LABEL/NUMBER/DATE比较
         (5).关闭创建的workbook对象:workbook.close(); //关闭workbook对象,释放读取数据表的过程中所占用的内存
       3.修改/设置excel
         (1).单元格操作
             <1>.设置单元格中内容的字体:
                 ①.实例化字符串/数字/日期格式对象:
                    WritableFont wf = new WritableFont(WritableFont.TIMES/WritableFont.createFont("字体名"),16,WritableFont.BOLD); //以指定字体、字号、字体风格实例化字体对象
             NumberFormat nf = new NumberFormat("#.##");
             jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
                 ②.实例化单元格格式化对象:WritableCellFormat wcf = new WritableCellFormat(字符串/数字/日期格式对象); //以指定字符串/数字/日期格式对象实例化单元格格式化对象
                 ③.设置格式:wcf.setAlignment(jxl.format.Alignment.CENTRE); //设置水平对齐方式
           wcf.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); //设置垂直对齐方式
           wcf.setWrap(true); //设置自动换行
                 ④.将单元格格式化对象添加的单元格对象中:Label label = new Label(0,0,"content",wcf);
             <2>.合并单元格:WritableSheet对象.mergeCells(rowNumber,columnNumber,rowNumber,columnNumber); //合并指定单元格到指定单元格的所有单元格 注:合并后的单元格不能再次进行合并,否则触发异常
             <3>.设置行高和列宽:WritableSheet对象.setRowView(rowNumber,rowHeight); //将指定行的高度设为指定高度
       WritableSheet对象.setColumnView(columnNumber,columnWidth); //将指定列的宽度设为指定宽度

    幸运之神的降临,往往只是因为你多看了一眼,多想了一下,多走了一步
  • 相关阅读:
    力学,结构动力NewMark法软组织模拟
    力学,非线性形变
    力学,线性形变
    波动方程水面模拟(简版)
    FFT海面(简版)
    测地极坐标参数化纹理贴图
    参数化离散指数映射纹理贴图
    Gridview中各个事件的操作以及FindControl
    CSS样式
    博客声明(博客大多均非原创文章,只用于记录)
  • 原文地址:https://www.cnblogs.com/gsxdream/p/3360518.html
Copyright © 2011-2022 走看看