2016-08-08 1 views
0

poi를 사용하여 특정 위치에 테이블을 삽입하려고합니다. 테이블이 생성되지만이 테이블이 보이지 않습니다.HWPF-POI : poi hwpf를 사용하여 테이블에 삽입 할 수 없습니다.

macOS 및 텍스트 도구로이 문서를 미리 보거나 편집 할 때 생성 된 테이블의 문서가 표시되며 POI는 테이블과 내용도 읽을 수 있습니다. 프로세스를 표시하기 위해 4 장의 사진을 업로드 할 계획이지만 2 장의 이미지 만 게시 할 수 있습니다. 죄송합니다.

@Test 
public void exportDoc() throws Exception { 
    FileInputStream readFile = new FileInputStream(new File(readDoc)); 
    FileOutputStream replaceFile = new FileOutputStream(new File(replaceDoc)); 
    HWPFDocument document = new HWPFDocument(readFile); 
    Table table = WordUtil.insertNewTable(document,"${table}"); 
    insertTableInDoc(table); 
    document.write(replaceFile); 
    readFile.close(); 
    replaceFile.close(); 
} 

private Table insertNewTable(HWPFDocument doc, String sourceValue) { 
    Range range = doc.getRange(); 
    Table table = null; 
    for (int i = 0; i < range.numSections(); ++i) { 
     Section s = range.getSection(i); 
     for (int x = 0; x < s.numParagraphs(); x++) { 
      Paragraph p = s.getParagraph(x); 
      if (p.text().contains(sourceValue)) { 
       //remove target text 
       range.replaceText(sourceValue, ""); 
       table = p.insertTableBefore((short) 3, 3); 
       return table; 
      } 
     } 
    } 
    return table; 
} 

private void insertTableInDoc(Table table) { 
    int count = 1; 
    for (int rowNum = 0; rowNum < table.numRows(); rowNum++) { 
     TableRow tableRow = table.getRow(rowNum); 
     for (int colNum = 0; colNum < tableRow.numCells(); colNum++) { 
      TableCell cell = tableRow.getCell(colNum); 
      Paragraph paragraph = cell.getParagraph(0); 
      CharacterRun characterRun = paragraph.getCharacterRun(0);   
      characterRun.insertBefore("number: " + count++); 
     } 
    } 
} 
  1. the original doc

  2. the doc after table insert

PS :

,

나는 이것이 Mac의 문제에 대해 Microsoft가 아니라고 확신합니다. Windows 플랫폼의 doc 테이블의 테이블도 표시되지 않습니다.

HWPF 프로젝트의 현재 상태와

+0

귀하의 정보 : 귀하의 문제를 재현 할 수 있습니다. insertTableBefore로 추가 된 테이블의 너비가 고정 된 것처럼 보입니다. Word GUI조차도이를 복구 할 수 없습니다. 하지만 HWPF (바이너리 Word 형식)로 더 이상 귀찮게하지 않을 것입니다. 이 형식은 2007 년 이래 구형입니다. XWPF (Office OpenXML)가 현재 형식입니다. 아무도 대답하지 않기 때문에 나는이 의견을 가진 유일한 사람이 아니라고 생각합니다. –

+0

대단히 고맙고 회신 해 주셔서 감사합니다. 필자는 제품 관리자에게 이전에 doc과 docx의 차이점에 대해 설명했지만 그녀는 doc 유형을 지원해야한다고 주장했습니다. 우리는 테이블을 가진 docx 형식의 사용자 내보내기 단어 만 허용하는 전략을 변경해야합니다. –

답변

1

, 당신 가능성 (. 감사합니다 알려 주시면 지체없이 수정하겠습니다 아무것도 잘못된 경우 처음이 질문을하거나 내 표현하지 분명하다) .doc 파일에 내용을 삽입하려고 할 때 운이 없다. 가장 좋은 방법은 다른 형식 (docx)을 사용하는 것입니다.

나는 내가 HWPF의 현재 상태에 관한 여기 잘못 될 수있다, 지난 1 년간 HWPF 보지 않았다

몇 년 전 나는 클라이언트에 대한 사용자 정의 HWPF 라이브러리를 개발했다. 해당 사용자 지정 라이브러리의 주요 목표는 .doc 파일을 수정하는 기능이었으며 Word는 수정 된 파일을 올바르게 처리 할 수있었습니다. 따라서 .doc 파일을 수정하는 수준이 얼마나 실패 할 수 있는지 결국 알 수 있습니다. 공용 HWPF 라이브러리는 수정 (텍스트 상자, 2 바이트 문자 범위, 모양 파일, 중첩 테이블 등) 할 때 .doc 파일 형식의 여러 측면을 처리 할 수 ​​없습니다.

올바르게 수정하려면 특정 .doc 파일의 모든 "기능"이 라이브러리에서 지원되어야합니다. 따라서 .doc 파일에 도형이있는 경우 HWPF는 간단한 텍스트 조각을 삽입하고 도형을 건드리지 않은 경우에도 도형의 위치 테이블을 조정해야합니다. 셰이프를 처리하지 않으면 출력 파일을 열 때 Word가 중단됩니다.

가능한 경우 docx 또는 rtf를 사용하십시오. 옵션 인 경우 .doc 파일을 처리 할 수있는 상용 라이브러리 중 하나를 사용해보십시오.

+0

대단히 고맙고 회신 해 주셔서 감사합니다. POI에 대한 많은 내부 정보를 이해하고 귀하의 제안은 합리적입니다. 정말 당신의 대답을 주셔서 감사합니다 :) –