JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 POI excel 呈現方式
1234





發文: 146
積分: 0
於 2008-09-16 11:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問POI有沒有方法可以用不分頁籤的方式呈現excel內容

就是在同一個sheet中以分頁方式呈現資料


reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
TsaiCF





發文: 44
積分: 0
於 2008-09-16 11:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
看不懂需求... excel 不是本來就會分頁嗎?

如果只是 標題列 重複, poi 有 api 可設。
若是多個表格,但不用重複標題列,那也沒有問題...
如果要多個表格但不同的標題列都重複,那麼是excel本身限制同一頁籤只有一組標題列設定。
除非自己算位置, 重複輸出標題, 但只要user一改欄寬格式等, 印出的效果就不對了... (而且也不像excel正常的應用方式了)


reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:TsaiCF]
1234





發文: 146
積分: 0
於 2008-09-16 14:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝你的回應~因為是第一次使用這方法寫報表,手邊的範例只有使用分頁籤的方式

我的需求是,以程式去讀取現有的excel(只有一個sheet,這個sheet有已畫好的空白表格A4)
我想用程式去複製事先畫好的空白表格,每頁一個表格,現在遇到一些問題

1.
HSSFSheet.removeRow(HSSFRow row) <==只有刪除row的資料,而不是移除整個row? 有沒有什麼方法可以移除整個row
2.
如何複製整個row? 我是用以下方法,但是有問題
1
2
3
4
5
6
7
8
9
10
//取得row0 和CellStyle
HSSFRow r0 = sheet1.getRow(0);
HSSFCell c1 = r0.getCell((short)0);
HSSFCellStyle style = c1.getCellStyle();  
 
//新增row 設定CellStyle
HSSFRow newRow = sheet1.createRow(rownum);
HSSFCell newCell = newRow.createCell((short)0);
newCell.setCellStyle(style); 
newCell.setCellValue("test");

結果: row0原本是佔了9個cell,但是新增的row只佔了一個cell
還要自己去計算和合併cell嗎? 有沒有其他方法可以複製整個row?

3.有沒有強制分頁的方法? 我的資料有分群組,某些群組的資料未滿一頁但是需要跳頁
我查document看到這方法 setColumnBreak(short column) //Sets a page break at the indicated column
但是在程式中呼叫沒正常分頁,出現NullPointerException
1
sheet1.setColumnBreak((short)1);//錯誤行
我猜我現在程式使用的lib是舊版的,所以沒有這個方法? 因為是接手修改別人的程式所以這點目前不確定

以上問題請指教
不知道大大有沒有範例可以提供~感恩


1234 edited on 2008-09-16 15:07
reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
TsaiCF





發文: 44
積分: 0
於 2008-09-16 19:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1.
HSSFSheet.shiftRows((int startRow, int endRow, int n)
2.
我的應用沒這種需求, 下面應該可以做到,但不見得是好的做法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// .... 略...
        int rownum = 5;
        HSSFRow newRow = sheet_1.createRow(rownum);
        HSSFCell newCell = newRow.createCell((short) 0);
        newCell.setCellValue(new HSSFRichTextString("test"));
        int numRegions = sheet_1.getNumMergedRegions();
        for (int i = 0; i < numRegions; i++) {
            Region region = sheet_1.getMergedRegionAt(i);
            if (region.getRowFrom() == 0 && region.getColumnFrom() == 3) {
                int dr = region.getRowTo() - 0;
                int dc = region.getColumnTo() - 3;
                Region rn = new Region(rownum, (short) (0), rownum + dr, (short) (0 + dc));
                sheet_1.addMergedRegion(rn);
            }
        }

3.
NullPointerException ?? 你確認 sheet1 不是 null?
我用
setColumnBreak(short column) / setRowBreak(int row)
都正常.


reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
1234





發文: 146
積分: 0
於 2008-09-18 16:33 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1.
HSSFSheet.shiftRows((int startRow, int endRow, int n)
這個方法應該是把 從startRow到endRow 移到n row吧? 不知道是不是我認知錯誤
本來以為 shiftRows(1,9,0) 應該會把row 0吃掉,結果不是這樣
參數試過幾種組合都不行, 請問一下你要移除某一列參數是怎麼下的??

2.我複製表格是這樣做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//功能: 複製sheet中的表格
//參數: sSheet=source, tSheet=target
//傳回: 無
public void copyForm(HSSFSheet sSheet, HSSFSheet tSheet) {
  try{    
    int pageNum = tSheet.getLastRowNum() / sSheet.getLastRowNum() + 1;  //複製到第幾頁
    int rowCountOfOnePage = sSheet.getLastRowNum() + 1;          //每頁資料筆數  
    int numRegions = sSheet.getNumMergedRegions();            //合併儲存格數   
      int rowNumStart = (pageNum - 1) * rowCountOfOnePage;        //第一筆rownum
        
       //合併儲存格
      for (int i = 0; i < numRegions; i++) {
        Region region = sSheet.getMergedRegionAt(i);
          int rf = region.getRowFrom();
          int cf = region.getColumnFrom();        
          int rt = region.getRowTo();
          int ct = region.getColumnTo();
 
          Region rn = new Region(rowNumStart + rf, (short)cf, rowNumStart + rt, (short)ct);
          tSheet.addMergedRegion(rn);
      }
      
      //複製列 
      for(int rowNum = 0; rowNum < rowCountOfOnePage; rowNum++) {
        HSSFRow oldRow = sSheet.getRow(rowNum);
        short rowHeights = oldRow.getHeight();  
      
        //新增列
        HSSFRow newRow = tSheet.createRow(rowNumStart + rowNum);
        newRow.setHeight(rowHeights);
      
        int fcn = oldRow.getFirstCellNum();
        int lcm = oldRow.getLastCellNum(); 
        for(int cellNum = fcn; cellNum < lcm; cellNum++) {
          HSSFCell oldCell = oldRow.getCell((short)cellNum);
          HSSFCellStyle style = oldCell.getCellStyle();       
          int cellType = oldCell.getCellType();
                
          //新增儲存格
          HSSFCell newCell = newRow.createCell((short)cellNum);
          newCell.setCellStyle(style);
        
          if(cellType == HSSFCell.CELL_TYPE_STRING) {
            newCell.setCellValue(oldCell.getStringCellValue());
          } else if(cellType == HSSFCell.CELL_TYPE_NUMERIC) {
            newCell.setCellValue(oldCell.getNumericCellValue());
          }      
        }      
      }
  } catch(Exception e) {
    e.printStackTrace();
  }      
}
但是出現很奇怪的情況,我的資料有50頁但是印出時變成64頁多出一些空白頁(表格分頁都正常沒有吃到下一頁)
經過測試,當複製表格大於36時就會有多出空白頁的情況

3.
我用 setColumnBreak(short column) / setRowBreak(int row) 都是NullPointerException
確定sheet1不是null, setColumnBreak的上一行我用sheet1.getLastRowNum()可以正常取得列數


reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
LiaoLuke





發文: 106
積分: 0
於 2008-09-18 17:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     for(int cellNum = fcn; cellNum < lcm; cellNum++) {
         HSSFCell oldCell = oldRow.getCell((short)cellNum);
         HSSFCellStyle style = oldCell.getCellStyle();       
          int cellType = oldCell.getCellType();
                
          //新增儲存格
          HSSFCell newCell = newRow.createCell((short)cellNum);
          newCell.setCellStyle(style);
        
          if(cellType == HSSFCell.CELL_TYPE_STRING) {
            newCell.setCellValue(oldCell.getStringCellValue());
          } else if(cellType == HSSFCell.CELL_TYPE_NUMERIC) {
            newCell.setCellValue(oldCell.getNumericCellValue());
          }      
        } 

可以改成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
for(int cellNum = fcn; cellNum < lcm; cellNum++) {
     HSSFCell oldCell = oldRow.getCell((short)cellNum);
     if(oldCell != null){
       int cellType = oldCell.getCellType();
       switch (cellType) {
         case HSSFCell.CELL_TYPE_BLANK:
                  //  TODO: handle  ocde
                   break;
         case HSSFCell.CELL_TYPE_BOOLEAN:
                  //  TODO: handle  ocde
                  break;
         case HSSFCell.CELL_TYPE_ERROR:
                  //  TODO: handle  ocde
                   break;
         case HSSFCell.CELL_TYPE_FORMULA:
                  //  TODO: handle  ocde
                   break;
         case HSSFCell.CELL_TYPE_NUMERIC:
                  //  TODO: handle  ocde
                   break;
         case HSSFCell.CELL_TYPE_STRING:
                  HSSFRichTextString stri = oldCell.getRichStringCellValue();//3.1 版本
                  String value = stri.getString();
                   //新增儲存格 ....
                     //  TODO: handle  ocde
                   break;
         default:
                  // 不在此範圍  不用新增儲存格 增加空白頁
                  //  TODO: handle  ocde
          break;
      }
    }else{
            // 不用 新增儲存格
    }  
 }

先判斷是否有值 ,在增加


LiaoLuke edited on 2008-09-18 17:24
reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
TsaiCF





發文: 44
積分: 0
於 2008-09-18 18:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1.
sheet1.removeRow(sheet_1.getRow(0));
sheet1.shiftRows(1,9,-1) ;

2. 欄寛一致嗎??
用 excel 預覽列印是否超過頁寛? 或超過頁面高度.
3.
我用 3.0.2 版.
你用 printStackTrace 出來是錯在什麼地方?


reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
1234





發文: 146
積分: 0
於 2008-09-19 14:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
LiaoLuke wrote:
...
可以改成
...

其實我是偷懶,已經事先知道資料有哪些,所以其他型別沒判斷@@
不過照你方法修改後多出空白頁的問題還是存在~感謝回覆

TsaiCF wrote:
1.
sheet1.removeRow(sheet_1.getRow(0));
sheet1.shiftRows(1,9,-1) ;

2. 欄寬一致嗎??
用 excel 預覽列印是否超過頁?? 或超過頁面高度.
3.
我用 3.0.2 版.
你用 printStackTrace 出來是錯在什麼地方?

1.sheet1.removeRow(sheet_1.getRow(0));
我改用3.0和3.1版,這方法還是只清除列資料,並沒有刪除列

2.欄寬一致,預覽列印都是剛好滿一頁,但是超過36頁就會變成一頁正常一頁空白
36正常 37空白 38正常 39空白...鬼月不是過了嗎 囧

3.改用新的lib兩種跳頁方法都正常了


1234 edited on 2008-09-19 14:18
reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:1234]
TsaiCF





發文: 44
積分: 0
於 2008-09-19 17:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
sheet1.shiftRows(1,9,-1) ; 的第三個參數是位移量(我也加了remove 是保險起見把資料清空)

但是,如果你是copy 的話,跳過那一列不就好了.....


TsaiCF edited on 2008-09-19 17:40
reply to postreply to post
作者 Re:POI excel 呈現方式 [Re:TsaiCF]
1234





發文: 146
積分: 0
於 2008-09-19 23:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
TsaiCF wrote:
sheet1.shiftRows(1,9,-1) ; 的第三個參數是位移量(我也加了remove 是保險起見把資料清空)

但是,如果你是copy 的話,跳過那一列不就好了.....

這個方法在你上一篇回應時有試出來了@@
只是不能理解為什麼removeRow不能刪除列
雖然用shiftRows也能做到刪除列的效果但是有點麻煩

因為我現在複製表格會多出莫名的空白頁
所以打算把原先只有一個表格的sheet1事先做出大於資料量的表格
塞完資料後再把多餘表格刪除 囧


reply to postreply to post
» JWorld@TW »  Java Tools

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8