精华内容
下载资源
问答
  • java使用POI获取sheet行数、列数
  • 关于java读取excel的问题。读取到某行有空值的错误privatevoidreadXml(StringfileName){booleanisE2007=false;//判断是否是excel2007格式if(fileName.endsWith("xlsx"))isE2007=true;try{InputStreaminput=...

    关于java读取excel的问题。读取到某行有空值的错误

    private void readXml(String fileName) {

    boolean isE2007 = false;    //判断是否是excel2007格式

    if(fileName.endsWith("xlsx"))

    isE2007 = true;

    try {

    InputStream input = new FileInputStream(fileName);  //建立输入流

    Workbook wb  = null;

    //根据文件格式(2003或者2007)来初始化

    if(isE2007)

    wb = new XSSFWorkbook(input);

    else

    wb = new HSSFWorkbook(input);

    Sheet sheet = wb.getSheetAt(0);     //获得第一个表单

    Iterator rows = sheet.rowIterator(); //获得第一个表单的迭代器

    while (rows.hasNext()) {

    Row row = rows.next();  //获得行数据

    System.out.println("Row #" + row.getRowNum());  //获得行号从0开始

    Iterator cells = row.cellIterator();    //获得第一行的迭代器

    String value = "";

    while (cells.hasNext()) {

    Cell cell = cells.next();  //获得列数据

    System.out.println("Cell #" + cell.getColumnIndex());

    switch (cell.getCellType()) {   //根据cell中的类型来输出数据

    case HSSFCell.CELL_TYPE_NUMERIC:

    //   System.out.println(cell.getNumericCellValue());

    DecimalFormat df = new DecimalFormat("0");

    String shu = df.format(cell.getNumericCellValue());  //将科学计数的转换

    value += shu+ ",";

    System.out.println(shu);

    break;

    case HSSFCell.CELL_TYPE_STRING:

    System.out.println(cell.getStringCellValue());

    value += cell.getStringCellValue() + ",";

    break;

    case HSSFCell.CELL_TYPE_BOOLEAN:

    System.out.println(cell.getBooleanCellValue());

    value += cell.getBooleanCellValue()+ ",";

    break;

    case HSSFCell.CELL_TYPE_FORMULA:

    System.out.println(cell.getCellFormula());

    value += cell.getCellFormula()+ ",";

    break;

    default:

    System.out.println("unsuported sell type");

    break;

    }

    }

    //写入数据库

    if(row.getRowNum()>0){

    String[] val = value.split(",");

    System.out.println(value);

    AddressList addressList= new AddressList();

    addressList.setName(val[0]);

    addressList.setTel(val[1]);

    addressList.setEmall(val[2]);

    addressList.setFax(val[3]);

    addressList.setRoomnum(val[4]);

    addressList.setOph(val[5]);

    addressList.setAddress(val[6]);

    addressList.setComments(val[7]);

    addressList.setSort(Integer.parseInt(val[8]));

    //addressList.setBirthday(val[9]);

    addressList.setPid(pid);

    addressList.setUserid(userid);

    addressList.setType(type);

    addressList.setSex(0);

    addressListService.save(addressList);

    }

    }

    } catch (IOException ex) {

    ex.printStackTrace();

    }

    }

    代码如上,原文http://blog.csdn.net/shuwei003/article/details/6741649 ,我在原文的基础上修改的,我是导入到sql里面 出现问题的地方是在//写入数据库,

    10284730.png

    当读取到第五列的时候因为是空的,addressList.setName(val[0]); 这就取不到,因为是根据数字来取值的,没有值就错。一错整个方法就运行不了

    ------解决思路----------------------

    http://blog.csdn.net/shuwei003/article/details/6741649

    试试能不能满足你的需求

    ------解决思路----------------------

    while (cells.hasNext()) {

    Cell cell = cells.next();  //获得列数据

    System.out.println("Cell #" + cell.getColumnIndex());

    switch (cell.getCellType()) {   //根据cell中的类型来输出数据

    case HSSFCell.CELL_TYPE_NUMERIC:

    //   System.out.println(cell.getNumericCellValue());

    DecimalFormat df = new DecimalFormat("0");

    String shu = df.format(cell.getNumericCellValue());  //将科学计数的转换

    value += shu+ ",";

    System.out.println(shu);

    break;

    case HSSFCell.CELL_TYPE_STRING:

    System.out.println(cell.getStringCellValue());

    value += cell.getStringCellValue() + ",";

    break;

    case HSSFCell.CELL_TYPE_BOOLEAN:

    System.out.println(cell.getBooleanCellValue());

    value += cell.getBooleanCellValue()+ ",";

    break;

    case HSSFCell.CELL_TYPE_FORMULA:

    System.out.println(cell.getCellFormula());

    value += cell.getCellFormula()+ ",";

    break;

    default:

    System.out.println("unsuported sell type");

    break;

    }

    }

    具体看看你的 数据 我看上面每一行都有 个  , default:

    value +=  ",";

    System.out.println("unsuported sell type");

    break;

    试试 。

    你在应该 value 的个数和你 的单元格个数数量一样。

    ------解决思路----------------------

    全部用String来接收他,初始给个null;

    然后加个判断if (a=null){a=0;}

    等要操作的时候强转int

    展开全文
  • FileInputStream inp = new FileInputStream("E:\\WEIAN.xls");... HSSFSheet sheet = wb.getSheetAt(2); // 获得第三个工作薄(2008工作薄) // 填充上面的表格,数据需要从数据库查询 HSSFRow ...
    		FileInputStream inp = new FileInputStream("E:\\WEIAN.xls"); 
    		HSSFWorkbook wb = new HSSFWorkbook(inp);
    		HSSFSheet sheet = wb.getSheetAt(2); // 获得第三个工作薄(2008工作薄)
    		// 填充上面的表格,数据需要从数据库查询
    		HSSFRow row5 = sheet.getRow(4); // 获得工作薄的第五行
    		HSSFCell cell54 = row5.getCell(3);// 获得第五行的第四个单元格
    		cell54.setCellValue("测试纳税人名称");// 给单元格赋值
    		//获得总列数
    		int coloumNum=sheet.getRow(0).getPhysicalNumberOfCells();
                    //获得总行数	
    		int rowNum=sheet.getPhysicalNumberOfRows();	
                    int rowNum=sheet.getLastRowNum();
    

     

    展开全文
  • java 读取excel获取真实行数

    万次阅读 2017-02-15 10:13:40
    读取excel获取真实行数 公司采用的是apache提供的包,通过XML文件的映射,把EXCEL表和我们的Model对应起来.本来是校验正确的,结果莫名其妙到后面就会报空指针异常.  问题的原因:在没有格式的前提下,...

    java 读取excel获取真实行数

    公司采用的是apache提供的包,通过XML文件的映射,把EXCEL表和我们的Model对应起来.本来是校验正确的,结果莫名其妙到后面就会报空指针异常. 
    问题的原因:在没有格式的前提下,getLastRowNum方法能够正确返回最后一行的位置;getPhysicalNumberOfRows方法能够正确返回物理的行数; 
    * 在有格式的前提下,这两个方法都是不合理的; 
    * 所以,在做导入excel的时候,建议想要正确获取行数,可以做一个人为的约定,比如约定导入文件第一列不允许为空,行数就按照第一列的有效行数来统计;这样就能正确获取到实际想要的行数;

    更新版本, 因为发现有时候 存在了加了样式的边框,边框的属性默认成为了 公式属性,导致后面空指针,现已修复

    修改版:

    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. /** 
    2.     * 用来得到真实行数 
    3.     * @param sheet 
    4.     * @param flag  需要写进数据库的列数用逗号隔开 比如  (Sheet sheet,int 2,int 3);随意个 
    5.     * @return 
    6.     *  
    7.     */  
    8. ublic static int findRealRows(Sheet sheet, int... flag) {  
    9.        int row_real = 0;  
    10.        int rows = sheet.getPhysicalNumberOfRows();// 此处物理行数统计有错误,  
    11.        int size = flag.length;  
    12.        try {  
    13.   
    14.   
    15.        for (int i = 1; i < rows; i++) {  
    16.            Row row = sheet.getRow(i);  
    17.            int total = 0;  
    18.            ArrayList<Integer> blank =new ArrayList<Integer>();  
    19.            int type=-1;  
    20.            String s = null;  
    21.            for(int j:flag){  
    22.                if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){  
    23.                    type=row.getCell(j).getCellType();  
    24.                    row.getCell(j).setCellType(1);  
    25.                }  
    26.   
    27.                if (row.getCell(j) == null||row.getCell(j).getStringCellValue().matches("^\\s+$")||row.getCell(j).getCellType()>2) {  
    28.                    total++;  
    29.   
    30.                    if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){  
    31.                    row.getCell(j).setCellType(type);  
    32.                    }  
    33.                    blank.add(j);  
    34.   
    35.                }  
    36.            }  
    37.            System.out.println(s+"我");  
    38.            // 如果4列都是空说明就该返回  
    39.            if (total == flag.length) {  
    40.   
    41.                return row_real;  
    42.            } else if (total == 0) {  
    43.                row_real++;  
    44.   
    45.            } else {  
    46.                String h="";  
    47.                for(Integer b:blank){  
    48.   
    49.                     h=h+"第"+(b+1)+"列"+" ";  
    50.                }  
    51.                throw new BusinessException("第" + (i + 1) + "行" + h  
    52.                        + "不能为空");  
    53.            }  
    54.   
    55.        }  
    56.        } catch (NullPointerException e) {  
    57.            throw new BusinessException("excel格式异常,请检查excel格式有无数据缺失,无效数据行!");  
    58.        }  
    59.        return row_real;  
    60.    }  

    方法都这样,通过约定一个有的ID来进行判断,可以较快的得到真实的行数 ,以至于后面的集合循环输出的话不会出现空指针异常


    ##利用POI在EXCEL表格中导入图片

    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. public void importExcelForCode(int x, int y, int width, int height,  
    2.             String no) throws Exception {  
    3.             //原装的EXCEL模板 如果要创建新的 在NWE XSSFWorkbook()中不需要带参数  
    4.         InputStream i = new FileInputStream("E:\\x.xlsx");  
    5.         //导入我的图片  
    6.         BufferedImage image = ImageIO.read(new File("E:\\name.jpg"));  
    7.         XSSFWorkbook xssfWorkbook = new XSSFWorkbook(i);  
    8.         XSSFSheet sheet = xssfWorkbook.getSheetAt(0);  
    9.         XSSFDrawing xssfDrawing = sheet.createDrawingPatriarch();  
    10.         //字节流  
    11.         ByteArrayOutputStream bao = new ByteArrayOutputStream();  
    12.         ImageIO.write(image, "jpg", bao);  
    13.                 //设置起始坐标,前四个是xy函数, 后四个是设置起始行列和图形行列 我选择后者  
    14.         XSSFClientAnchor anchor = new XSSFClientAnchor(0000, x, y, width  
    15.                 + x, height + y);  
    16.         anchor.setAnchorType(0);  
    17.         //创建图片  
    18.         xssfDrawing.createPicture(anchor, xssfWorkbook.addPicture(  
    19.                 bao.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));  
    20.                 //关闭流  
    21.         i.close();  
    22.         FileOutputStream fos = new FileOutputStream(new File(  
    23.                 "E:\\x.xlsx"));  
    24.         xssfWorkbook.write(fos);  
    25.         new File("E:\\" + no + ".jpg").delete();  
    26.     }  

     ##使用Zxing打造带有数字的二维码
    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. package com.x.ExportExcel;  
    2.   
    3. import java.awt.Color;  
    4. import java.awt.Font;  
    5. import java.awt.Graphics2D;  
    6. import java.awt.RenderingHints;  
    7. import java.awt.image.BufferedImage;  
    8. import java.io.ByteArrayOutputStream;  
    9. import java.io.File;  
    10. import java.io.FileInputStream;  
    11. import java.io.FileOutputStream;  
    12. import java.io.IOException;  
    13. import java.io.InputStream;  
    14. import java.util.Hashtable;  
    15.   
    16. import javax.imageio.ImageIO;  
    17.   
    18. import org.apache.poi.xssf.usermodel.XSSFClientAnchor;  
    19. import org.apache.poi.xssf.usermodel.XSSFDrawing;  
    20. import org.apache.poi.xssf.usermodel.XSSFSheet;  
    21. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
    22.   
    23. import com.google.zxing.BarcodeFormat;  
    24. import com.google.zxing.EncodeHintType;  
    25. import com.google.zxing.MultiFormatWriter;  
    26. import com.google.zxing.client.j2se.MatrixToImageWriter;  
    27. import com.google.zxing.common.BitMatrix;  
    28.   
    29. public class Code_128Utils {  
    30.   
    31.     private static final int WIDTH = 351;  
    32.     private static final int CODEHEIGHT = 55;  
    33.     private static final int HEIGHT = 78;  
    34.     private static final int FONTSIZE = 25;  
    35.     private static final String IMAGETYPE = "JPEG";  
    36.         //该方法用来生成所需二维码  不带数字  
    37.     public static void createCode(String no) throws Exception {  
    38.         FileOutputStream fos;  
    39.         fos = new FileOutputStream(new File("E:\\code\\" + no + ".jpg"));  
    40.         int width = WIDTH;  
    41.         int height = CODEHEIGHT;  
    42.         Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();  
    43.         hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  
    44.         BitMatrix m = new MultiFormatWriter().encode(no,  
    45.                 BarcodeFormat.CODE_128, width, height, hints);  
    46.         MatrixToImageWriter.writeToStream(m, IMAGETYPE, fos);  
    47.         fos.flush();  
    48.         fos.close();  
    49.         createFont(no);  
    50.   
    51.     }  
    52.             ///该方法用来生成二维码字体并且把二维码拼接到字体图片上  
    53.     public static void createFont(String no) throws Exception {  
    54.         BufferedImage font = new BufferedImage(WIDTH, HEIGHT,  
    55.                 BufferedImage.TYPE_INT_RGB);  
    56.         BufferedImage code = ImageIO.read(new File("E:\\code\\" + no + ".jpg"));  
    57.         Graphics2D g = (Graphics2D) font.getGraphics();  
    58.         //长宽是总的 字体加二维码的  
    59.         g.clearRect(00, WIDTH, HEIGHT);  
    60.         g.setColor(Color.WHITE);  
    61.         g.fillRect(00, WIDTH, HEIGHT);  
    62.         //字体渲染  
    63.         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
    64.                 RenderingHints.VALUE_ANTIALIAS_ON);  
    65.         g.setRenderingHint(RenderingHints.KEY_RENDERING,  
    66.                 RenderingHints.VALUE_RENDER_QUALITY);  
    67.                 //在图片上把字写好  
    68.         for (int i = 0; i < no.length(); i++) {  
    69.             g.setColor(Color.black);  
    70.             Font font_ = new Font("Consolas"0, FONTSIZE);  
    71.             g.setFont(font_);  
    72.             g.drawString(no.charAt(i) + "", (FONTSIZE * 2 + WIDTH - no.length()  
    73.                     * FONTSIZE)  
    74.                     / 2 + (i - 1) * FONTSIZE, CODEHEIGHT + HEIGHT - CODEHEIGHT);  
    75.         }  
    76.         //然后把二维码加上去   
    77.         g.drawImage(code, 00null);  
    78.         g.dispose();  
    79.         //进行图片处理,防止出现模糊  
    80.         int[] rgb = new int[3];  
    81.         for (int i = 0; i < WIDTH; i++) {  
    82.             for (int j = CODEHEIGHT; j < HEIGHT; j++) {  
    83.                 int pixel = font.getRGB(i, j);  
    84.                 rgb[0] = (pixel & 0xff0000) >> 16;  
    85.                 rgb[1] = (pixel & 0xff00) >> 8;  
    86.                 rgb[2] = (pixel & 0xff);  
    87.                 if (rgb[0] > 125 || rgb[1] > 125 || rgb[2] > 125) {  
    88.                     font.setRGB(i, j, -1);  
    89.                 }  
    90.                 if (rgb[0] < 100 || rgb[1] < 100 || rgb[2] < 100) {  
    91.                     font.setRGB(i, j, -16777216);  
    92.                 }  
    93.             }  
    94.         }  
    95.   
    96.         File outputfile = new File("E:\\code\\" + no + ".jpg");  
    97.         ImageIO.write(font, IMAGETYPE, outputfile);  
    98.     }  
    99.   
    100.   
    101. }  

    生成二维码形状
    展开全文
  • Java 读取Excel获取真实行数

    万次阅读 2018-11-08 09:56:51
     * 所以,在做导入excel的时候,建议想要正确获取行数,可以做一个人为的约定,比如约定导入文件第一列不允许为空,行数就按照第一列的有效行数来统计;这样就能正确获取到实际想要的行数; 更新版本, 因为发现有...

    刚进入公司开发,熟悉环境是个很大的难题,今天就接到了一个任务,让我修改批量上传excel文件的页面. 
    公司采用的是apache提供的包,通过XML文件的映射,把EXCEL表和我们的Model对应起来.本来是校验正确的,结果莫名其妙到后面就会报空指针异常. 
    问题的原因:在没有格式的前提下,getLastRowNum方法能够正确返回最后一行的位置;getPhysicalNumberOfRows方法能够正确返回物理的行数; 
    * 在有格式的前提下,这两个方法都是不合理的; 
    * 所以,在做导入excel的时候,建议想要正确获取行数,可以做一个人为的约定,比如约定导入文件第一列不允许为空,行数就按照第一列的有效行数来统计;这样就能正确获取到实际想要的行数;

    更新版本, 因为发现有时候 存在了加了样式的边框,边框的属性默认成为了 公式属性,导致后面空指针,现已修复

    修改版
     

    /**
     * 用来得到真实行数
     * @param sheet
     * @param flag  需要写进数据库的Excel单元格列索引,多列用逗号隔开 比如Excel有5列单元格,其中4列 
     * 需要入库,第2列不需要入库,这里flag就传 [0,2,3,4]
     * @return
     * 
     */
    public static int findRealRows(Sheet sheet, int... flag) {
    	int row_real = 0;
    	int rows = sheet.getPhysicalNumberOfRows();// 此处物理行数统计有错误,
    	int size = flag.length;
    	try {
    
    
    	for (int i = 1; i < rows; i++) {
    		Row row = sheet.getRow(i);
    		int total = 0;
    		ArrayList<Integer> blank =new ArrayList<Integer>();
    		int type=-1;
    		String s = null;
    		for(int j:flag){
    			if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){
    				type=row.getCell(j).getCellType();
    				row.getCell(j).setCellType(1);
    			}
    
    			if (row.getCell(j) == null||row.getCell(j).getStringCellValue().matches("^\\s+$")||row.getCell(j).getCellType()>2) {
    				total++;
    
    				if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){
    				row.getCell(j).setCellType(type);
    				}
    				blank.add(j);
    
    			}
    		}
    		System.out.println(s+"我");
    		// 如果4列都是空说明就该返回
    		if (total == flag.length) {
    
    			return row_real;
    		} else if (total == 0) {
    			row_real++;
    
    		} else {
    			String h="";
    			for(Integer b:blank){
    
    				 h=h+"第"+(b+1)+"列"+" ";
    			}
    			throw new BusinessException("第" + (i + 1) + "行" + h
    					+ "不能为空");
    		}
    
    	}
    	} catch (NullPointerException e) {
    		throw new BusinessException("excel格式异常,请检查excel格式有无数据缺失,无效数据行!");
    	}
    	return row_real;
    }

    方法都这样,通过约定一个有的ID来进行判断,可以较快的得到真实的行数 ,以至于后面的集合循环输出的话不会出现空指针异常

    原文地址:https://blog.csdn.net/hn5091/article/details/44179961

    展开全文
  • Java使用Workbook/Sheet读取excel行数

    千次阅读 2019-07-08 19:57:57
    ### WorkBook/Sheet简介 ... * 获取excel文件实际行数 * * @param file */ public static int readFileLength(MultipartFile file) { // 文件函数 int lineLength = 0; // 声明workbook对象
  • 获取工作表上的最后一行注意:Excel和Apache POI可能仍将之前具有内容并稍后设置为空的行计为行,因此此方法的结果将包括此类行,因此返回值可能会更高超出预期! 返回值: 此工作表中包含的最后一行(从0开始);...
  • 获取sheet表单里的有效行数

    千次阅读 2017-03-07 18:36:00
    public int getRealRowNum(Sheet sheet) { int rowNum = sheet.getLastRowNum()-1; while(rowNum > 0 ){ Row row = sheet.getRow(rowNum+1); if (row != null) { ...
  • 获得文件有效行数(非空行) [code="java"] import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ...
  • Java获取Excel表格的真实行数

    千次阅读 2020-04-29 14:15:21
    } /** * 获取excel表格的真实行数 * @param sheet excel文件的工作簿的名称 * @return */ public static int getExcelRealRow(Sheet sheet) { boolean flag = false; for (int i = 1; i <= sheet.getLastRowNum(); ...
  • // 获得总记录数(行数) int lastRowNum = sheet.getLastRowNum(); int rowNum=sheet.getPhysicalNumberOfRows(); // 获得总字段数(列数) int columnCount = sheet.getRow(0).getPhysicalNumberOfCells...
  • poi获取实际行数

    2015-12-20 01:56:10
    最近在学习POI POI的API没有真正的获取填写数据的行数 我在网上找到了 与其分享

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,055
精华内容 2,822
关键字:

java获取sheet行数

java 订阅