Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 651|回复: 0

poi读取一份word里的表格读不完

  [复制链接]

该用户从未签到

发表于 2014-9-25 15:31:56 | 显示全部楼层 |阅读模式
10Java金币
本帖最后由 monica_1028 于 2014-9-26 08:30 编辑

请问一下   
poi读取一份word里的表格,其余一百多张表格都可以正常读取,但是其中一个只能读取一部分
我把这张有问题的表单独拿出来又可以完整读取
是什么问题啊




把大的word里面那张出问题的表删除后,又会有接下来的某张表读不完,但是其他表都正常,包括出问题那张表后面的表





具体情况


                        FileInputStream in = new FileInputStream("...");//载入文档
                        POIFSFileSystem pfs = new POIFSFileSystem(in);
                        HWPFDocument hwpf = new HWPFDocument(pfs);
                        Range range = hwpf.getRange();//得到文档的读取范围
                        TableIterator it = new TableIterator(range);
//                        int k1=1;
                        
                        //System.out.println("迭代表格开始");
                        //迭代文档中的表格
                        while (it.hasNext())
                        {
                                List<Record> recordlist = new ArrayList<Record>();
                                Table tb = (Table) it.next();
                                //迭代行,默认从1开始
                                for (int i = 1; i < tb.numRows(); i++)
                                {
                                        TableRow tr = tb.getRow(i);
                                        //迭代列,默认从0开始
                                        Record re = new Record();
                                        for (int j = 0; j < tr.numCells(); j++)
                                        {
                                                TableCell td = tr.getCell(j);//取得单元格
                                                String st="";
                                                //取得单元格的内容
                                                for(int k=0;k<td.numParagraphs();k++)
                                                {   
                                      Paragraph para =td.getParagraph(k);   
//                                      String s = para.text();
//                                      st +=s+"  ";
                                      st = para.text();
                                } //end for
                                                if (st!=null&&st.compareTo("")!=0) {
                                                        if(j==0)
                                                        {
                                                                re.setValue(st.trim());
                                                        }
                                                        else
                                                                if(j==1)
                                                                {
                                                                        re.setDefinition(st.trim());
                                                                }
                                                                else
                                                                        re.setExplanation(st.trim());
                                                        
                                                } else {
                                                        System.out.println("记录为空");
                                                }
                                                
                                        } //end for
                                        recordlist.add(re);
                                       
                                } //end for
//                                System.out.println(k1);
//                                System.out.println(recordlist);//一行结束
//                                k1++;

                                tablelist.add(recordlist);
                    } //end while
                        
                } catch (Exception e) {
                        e.printStackTrace();
                }
                System.out.println(tablelist);
                return tablelist;



上面是代码,直接把s一个一个打印出来发现的问题是
1


2
±

3
+
4
++

5
+++


125都是正常的,3和4中间少了一行隔开,另外一个出问题的地方也是一样

把记录打印出来,会发现出问题的表多了明显多了一条记录

[bean.Record@83bbd2, bean.Record@9fe17d, bean.Record@8cd8f0, bean.Record@f6ab36, bean.Record@628999, bean.Record@137ab64, bean.Record@1d55ef8]

本该只有6个,估计第三个刚好是个空,因为入库的时候的时候我有  not  null 的设置,所以会有提醒,等我把not null  限制去掉,不报错了,但是也只有前几条能入库,后面正常的几条如不了库

回复

使用道具 举报

  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2014-9-25 18:28:56 | 显示全部楼层
    可否贴下代码 这样描述有些不知道情况。
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-9-25 20:37:10 | 显示全部楼层
    admin 发表于 2014-9-25 18:28
    可否贴下代码 这样描述有些不知道情况。

      public static void testWord(String wordPath) {

                  try {

                         FileInputStream in = new FileInputStream(wordPath);// 载入文档

                         POIFSFileSystem pfs = new POIFSFileSystem(in);

                         HWPFDocument hwpf = new HWPFDocument(pfs);

                         Range range = hwpf.getRange();// 得到文档的读取范围

                         TableIterator it = new TableIterator(range);

                         // 迭代文档中的表格

                         while (it.hasNext()) {

                                Table tb = (Table) it.next();

                                // 迭代行,默认从0开始

                                for (int i = 0; i < tb.numRows(); i++) {

                                       TableRow tr = tb.getRow(i);

                                       // 迭代列,默认从0开始

                                       for (int j = 0; j < tr.numCells(); j++) {

                                              TableCell td = tr.getCell(j);// 取得单元格

                                              // 取得单元格的内容

                                              for (int k = 0; k < td.numParagraphs(); k++) {

                                                     Paragraph para = td.getParagraph(k);

                                                     String s = para.text().trim();

                                                     System.out.println(s);

                                              } // end for
                                         /*这里加了一个把s放到list里的代码*/

                                       } // end for

                                } // end for

                         } // end while

                  } catch (Exception e) {

                         e.printStackTrace();

                  }

           }// end method

          

    }



    具体的我这台电脑没有,或者我明早回详细的
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-9-26 08:29:12 | 显示全部楼层
    admin 发表于 2014-9-25 18:28
    可否贴下代码 这样描述有些不知道情况。

                            FileInputStream in = new FileInputStream("...");//载入文档
                            POIFSFileSystem pfs = new POIFSFileSystem(in);
                            HWPFDocument hwpf = new HWPFDocument(pfs);
                            Range range = hwpf.getRange();//得到文档的读取范围
                            TableIterator it = new TableIterator(range);
    //                        int k1=1;
                            
                            //System.out.println("迭代表格开始");
                            //迭代文档中的表格
                            while (it.hasNext())
                            {
                                    List<Record> recordlist = new ArrayList<Record>();
                                    Table tb = (Table) it.next();
                                    //迭代行,默认从1开始
                                    for (int i = 1; i < tb.numRows(); i++)
                                    {
                                            TableRow tr = tb.getRow(i);
                                            //迭代列,默认从0开始
                                            Record re = new Record();
                                            for (int j = 0; j < tr.numCells(); j++)
                                            {
                                                    TableCell td = tr.getCell(j);//取得单元格
                                                    String st="";
                                                    //取得单元格的内容
                                                    for(int k=0;k<td.numParagraphs();k++)
                                                    {   
                                          Paragraph para =td.getParagraph(k);   
    //                                      String s = para.text();
    //                                      st +=s+"  ";
                                          st = para.text();
                                    } //end for
                                                    if (st!=null&&st.compareTo("")!=0) {
                                                            if(j==0)
                                                            {
                                                                    re.setValue(st.trim());
                                                            }
                                                            else
                                                                    if(j==1)
                                                                    {
                                                                            re.setDefinition(st.trim());
                                                                    }
                                                                    else
                                                                            re.setExplanation(st.trim());
                                                            
                                                    } else {
                                                            System.out.println("记录为空");
                                                    }
                                                    
                                            } //end for
                                            recordlist.add(re);
                                           
                                    } //end for
    //                                System.out.println(k1);
    //                                System.out.println(recordlist);//一行结束
    //                                k1++;

                                    tablelist.add(recordlist);
                         } //end while
                            
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    System.out.println(tablelist);
                    return tablelist;



    上面是代码,直接把s一个一个打印出来发现的问题是
    1


    2
    ±

    3
    +
    4
    ++

    5
    +++


    125都是正常的,3和4中间少了一行隔开,另外一个出问题的地方也是一样

    把记录打印出来,会发现出问题的表多了明显多了一条记录

    [bean.Record@83bbd2, bean.Record@9fe17d, bean.Record@8cd8f0, bean.Record@f6ab36, bean.Record@628999, bean.Record@137ab64, bean.Record@1d55ef8]

    本该只有6个,估计第三个刚好是个空,因为入库的时候的时候我有  not  null 的设置,所以会有提醒,等我把not null  限制去掉,不报错了,但是也只有前几条能入库,后面正常的几条如不了库
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 23:45 , Processed in 0.384692 second(s), 32 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表