Читать Excel с макросом из Java - PullRequest
0 голосов
/ 15 января 2011

У меня есть Excel. и я создаю макрос в файл Excel для чтения данных из других ресурсов. макрос запускается каждую секунду и обновляет свои ячейки Excel.

Теперь я хочу создать Java-программу для чтения данных Excel каждую секунду. Я пробовал Apache POI, но после проверки документации ti не поддерживает чтение файла Excel с макросом.

Я читаю из некоторых ресурсов Java Com Bridge (JCOB) можно использовать для чтения Excel с помощью макросов. Я пытался, но значение ячейки по-прежнему не обновляется каждый раз, когда я пытаюсь мой код.

import com.jacob.com.*;
import com.jacob.activeX.*;

public class ExcelTest {
 private static ActiveXComponent xl;
 private static Dispatch workbooks = null;
 private static Dispatch workbook = null;
 private static Dispatch sheet = null;
 private static String filename = null;
 private static boolean readonly = false;

 public static void main(String[] args) {
  String file = "D:\\tutorial\\ApachePoi\\ratesource.xls";
  OpenExcel(file, false); // do not show false to open Excel
  System.out.println(GetValue("B46"));
 }

 private static void OpenExcel(String file, boolean f) {
  try {
   filename = file;
   xl = new ActiveXComponent("Excel.Application");
   xl.setProperty("Visible", new Variant(f));
   workbooks = xl.getProperty("Workbooks").toDispatch();
   workbook = Dispatch.invoke(
     workbooks,
     "Open",
     Dispatch.Method,
     new Object[] { filename, new Variant(false),
       new Variant(readonly) },// whether to open read-only
     new int[1]).toDispatch();
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 // Read value
 private static String GetValue(String position) {
  if (workbook == null) {
   System.out.println("workbook is null");
  }
  sheet = Dispatch.get(workbook, "ActiveSheet").toDispatch();
  Object cell = Dispatch.invoke(sheet, "Range", Dispatch.Get,
    new Object[]{position}, new int[1]).toDispatch();
  String value = Dispatch.get((Dispatch) cell, "Value").toString();

  return value;
 }
 //1.3638356164383563
 //1.3638356164383563




 private static void SetValue (String position, String type, String value)  
 {  

 }



}

Ответы [ 2 ]

1 голос
/ 15 января 2011

Я не знаком с механизмом Excel, способным выполнять то, что вы описываете.

Рассматривали ли вы вместо этого разговор с Excel и спрашивали его значения при работе с электронной таблицей?Я полагаю, что вы можете сделать это с ODBC.

Другим подходом может быть создание версии OpenOffice вашего листа и обращение к OpenOffice.

0 голосов
/ 15 января 2011

Одна ловушка - это poi: не меняйте значение существующей записи Excel в другой файл, и вы можете увидеть разницу

workbook.getSheet().getRow(1).getCell(0).setValue("test");

и записать эту (измененную) книгу в другой файл

public void writeFile(String fileName) {
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(fileName);
        getWorkbook().write(fos);
        fos.close();
    } catch (IOException e) {
        System.out.println("IOException occurs");
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...