Получить значение текстового поля из Excel в Java

У меня есть файл Excel, и мне нужно прочитать значение из текстового поля внутри этого файла Excel.

Я использую библиотеку org.apache.poi и пытался получить значение следующим образом:

   List<HSSFObjectData> obj=workbook.getAllEmbeddedObjects();
   for (int i = 0; i < obj.size(); i++) {           
       HSSFTextbox t = (HSSFTextbox) obj.get(i);
   }

К сожалению, я не смог привести HSSFTextbox к элементу HSSFObjectData.

Кто-нибудь знает, как это можно сделать?


person Mike    schedule 20.12.2012    source источник
comment
Содержит ли ваш Excel какие-либо документы или презентации?   -  person NPKR    schedule 20.12.2012
comment
Документ Excel содержит текстовые поля и кнопки и имеет код VBA сзади, который обрабатывает данные из текстовых полей. У меня есть приложение Java, в котором мне нужны значения из Texboxes.   -  person Mike    schedule 20.12.2012


Ответы (2)


Может быть, вы можете сделать так:

    try {
        InputStream input = new FileInputStream("qa-textbox.xls");
        POIFSFileSystem fs = new POIFSFileSystem(input);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFPatriarch pat = sheet.getDrawingPatriarch();
        List children = pat.getChildren();

        Iterator it = children.iterator(); 
        while(it.hasNext()) {           
            HSSFShape shape = (HSSFShape)it.next();
            if (shape instanceof HSSFTextbox){
              HSSFTextbox textbox = (HSSFTextbox)shape;
              HSSFRichTextString richString = textbox.getString();
              String str = richString.getString();
              System.out.println("String: " + str);
              System.out.println("String length: " + str.length());
            }
        }  
    } catch (IOException ex) {
        ex.printStackTrace();
    }
person lichengwu    schedule 20.12.2012
comment
Спасибо за ваш ответ. Я адаптировал ваш код в своем приложении. Ошибок не было, но ни одна из фигур не соответствовала HSSFTextbox. Первоначально, когда я перебирал объекты с помощью HSSFObjectData и obj.get(i).getOLE2ClassName(), распечатывались следующие элементы: Forms.TextBox.1 Forms.TextBox.1 Forms.TextBox.1 Forms.Label.1 Forms.TextBox. 1 Forms.Label.1 Forms.Label.1 Forms.Label.1 Forms.CommandButton.1 Forms.TextBox.1, и я думал, что Forms.TextBox.1 имеет тип HSSFTextbox - person Mike; 20.12.2012

это поможет прочитать ваш лист Excel

HSSFWorkbook workbook = new HSSFWorkbook(fs);
      for (HSSFObjectData obj : workbook.getAllEmbeddedObjects()) {
          //the OLE2 Class Name of the object
          String oleName = obj.getOLE2ClassName();
          if (oleName.equals("Worksheet")) {
              DirectoryNode dn = (DirectoryNode) obj.getDirectory();
              HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(dn, fs, false);
              //System.out.println(entry.getName() + ": " + embeddedWorkbook.getNumberOfSheets());
        readSheetElements(embeddedWorkbook);

          } else if (oleName.equals("Document")) {
              DirectoryNode dn = (DirectoryNode) obj.getDirectory();
              HWPFDocument embeddedWordDocument = new HWPFDocument(dn, fs);
              //System.out.println(entry.getName() + ": " + embeddedWordDocument.getRange().text());
          }  else if (oleName.equals("Presentation")) {
              DirectoryNode dn = (DirectoryNode) obj.getDirectory();
              SlideShow embeddedPowerPointDocument = new SlideShow(new HSLFSlideShow(dn, fs));
              //System.out.println(entry.getName() + ": " + embeddedPowerPointDocument.getSlides().length);
          } else {
              if(obj.hasDirectoryEntry()){
                  // The DirectoryEntry is a DocumentNode. Examine its entries to find out what it is
                  DirectoryNode dn = (DirectoryNode) obj.getDirectory();
                  for (Iterator entries = dn.getEntries(); entries.hasNext();) {
                      Entry entry = (Entry) entries.next();
                      //System.out.println(oleName + "." + entry.getName());
                  }
              } else {
                  // There is no DirectoryEntry
                  // Recover the object's data from the HSSFObjectData instance.
                  byte[] objectData = obj.getObjectData();
              }
          }
      }

    public void readSheetElements(HSSFWorkbook embeddedWorkbook) {
     HSSFSheet  hSSFSheet = embeddedWorkbook.getSheet(0);
     java.util.Iterator<Row>    rowItr = hSSFSheet .rowIterator() ;
    while(rowItr .hasNext()) {

     java.util.Iterator<Cell>   cellItr  = rowItr.next().cellIterator() ;
     // read cell value from each cell

    }
person NPKR    schedule 20.12.2012