Как читать динамически изменяющиеся значения из листа Excel в Java без сохранения листа Excel - PullRequest
0 голосов
/ 26 мая 2018

Я использую приложение Nest Trader (Торговля на фондовом рынке), которое предоставляет значения в таблице Excel и очень быстро обновляет значения в ячейках за миллисекунды.

Я хочу прочитать эти значения и сохранить их в видебаза данных.
Я использую библиотеку apache poi-3.17.

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Если вы застряли только в том, чтобы получить значения в Excel, вы можете написать функцию листа (UDF), чтобы взять ваши значения и записать их в базу данных.

Вы можете написать функции листа Excelв Java с использованием Jinx, https://exceljava.com.

0 голосов
/ 30 мая 2018

Как читать динамически изменяющиеся значения из листа Excel в Java без сохранения листа Excel?

Если пока не достигнуто, может прибегнуть к использованию JDDE -библиотека, как подробно описано ниже.


Миллисекунды - это много времени ...

В обычных торговых средах (то есть до сих пор не говорят даже о низком уровне(конец HFT), все наносекунды [ns] задержки курируются, лучше избегать, не добавляя намного больше нескольких [us], поэтому [ms] действительно много времени- тем не менее, все же стоит перенести любые наивные реализации в «удаленную» сторону принципиально , поскольку это «экспортирует» такую ​​рабочую нагрузку (чтобы не тратить критическое время на вашу частьплатформа) + это также позволяет избежать задержек, связанных с задержкой, поскольку решения принимаются в кратчайшие сроки (и далее объявляются только в тех случаях, которые относятся к вашей части платформы).


майповторно использовать это:

JDDE - это JNI бесплатная библиотека Java с открытым исходным кодом, которая позволяет приложениям Java взаимодействовать с собственными приложениями на платформе Windows (если они все еще позволяют это - имели проблемы в Vista64, но это выходит за рамки этого поста) через D ynamic D ata E xchange (он же DDE) протокол.


Пример грубой DDE-силы:

В качестве примера использования вида brute-force приведенный ниже код установит соединение DDE с запущенным приложением Microsoft Excel из Java.

Другой,Более разумным способом, если реализация Excel-DDE все еще поддерживает это в 2018+, является подписка на все изменения «отслеживаемого» -контента (поскольку это намного ближе к системе Trading-eco-system, и системы REUTERS использовали это какЕще с 199х, даже в дни, Windows O / S еще не была оснащена сетью на основе TCP / IP, которая работала с использованием DDE уже в те дни: o)

Пример naive-brute-DDE-force выполняет:
- операция REQUEST для чтения данных из A1 -клетки, как было в теме этого предмета
+ операция POKE для изменения данных в ячейке A1, и
+ операция EXECUTE для закрытия документа Excel, если это необходимо для других случаев использования.

 /*
 * Copyright 2009 www.pretty-tools.com. All rights reserved.
 */

import com.pretty_tools.dde.ClipboardFormat;
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.client.DDEClientConversation;

/**
 * Excel Example.
 *
 * @author Alexander Kozlov
 */

public class ExcelExample
{
    public static void main( String[] args )
    {
        try
        {
                         //                                DDE client
            final DDEClientConversation conversation = new DDEClientConversation();
                         //                     We can use UNICODE format if server prefers it
         // conversation.setTextFormat( ClipboardFormat.CF_UNICODETEXT );

            conversation.setTimeout( 3000 );
                         //                     Establish conversation with opened and active workbook
            conversation.connect( "Excel", "Sheet1" );
                         //                     if you have several opened files,
                         //                        you can establish conversation using file path
         // conversation.connect( "Excel", "C:\\Book1.xlsx" );
                         //                     or you can also specify Sheet
         // conversation.connect( "Excel", "C:\\[Book1.xlsx]Sheet2" );
            try
            {
                             //                  Requesting A1 value
                System.out.println( "A1 value: " + conversation.request( "R1C1" ) );
                             //                  Changing cell A1 value to "We did it!"
                conversation.poke( "R1C1", "We did it!" );
                conversation.poke( "R2C2", "We did it again!".getBytes(), ClipboardFormat.CF_TEXT );
                             //                  Fill several cells of the same row,
                             //                       using \t as separator
                conversation.poke( "R4", "Fill\tthe\trow" );
                             //                  Fill several cells of the same column,
                             //                       using \n as separator
                conversation.poke( "C4", "Fill\nthe\ncolumn" );
                             //                  Fill several cells with matrix,
                             //                       using \t as column separator
                             //                         and \n as row separator
                conversation.poke( "R5C5:R7C7", "1\t2\t3\n4\t5\t6\n7\t8\t9" );
                             //                  Run macro with name Macro1
             // conversation.execute( "[run(\"Macro1\")]" );
                             //                  Sending "close()" command
                conversation.execute( "[close()]" );
                             //                  or we can use byte array to send command
             // conversation.execute( "[close()]\0".getBytes() );
            }
            finally
            {
                conversation.disconnect();
            }
        }
        catch ( DDEMLException e )
        {
            System.out.println( "DDEMLException: 0x"
                              +  Integer.toHexString( e.getErrorCode() )
                              + " "
                              +  e.getMessage()
                                 );
        }
        catch ( DDEException e )
        {
            System.out.println( "DDEClientException: "
                              +  e.getMessage()
                                 );
        }
        catch ( Exception e )
        {
            System.out.println( "Exception: "
                              +  e
                                 );
        }
    }
}

Способ SMART-er
- избегать "ручного" опроса
+ выгрузка в DDE-саморекламируемый монитор изменений / пропагатор:

В следующем примере прослушиваются изменения в ячейках Excel.Метод .setEventListener() используется для настройки асинхронного обработчика событий (агент, работающий в для прослушивания удаленных событий и отвечающий за него - как только он получит любой такой- для реакции местного реагирования на местное событие (а), которые произошли).

В этой простой демонстрационной модели он просто распечатает любой пульт дистанционного управления A1 -cell переходит в локальную консоль этого Java-приложения (и обрабатывает событие отключения, очевидно, такой же важный шаг):

/*
 * Copyright 2009 www.pretty-tools.com. All rights reserved.
 */

import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.client.DDEClientConversation;
import com.pretty_tools.dde.client.DDEClientEventListener;
import com.pretty_tools.dde.DDEMLException;

/**
 * Excel Advice Example.
 *
 * @author Alexander Kozlov
 */

public class ExcelAdviceExample
{
    public static void main( String[] args )
    {
        try
        {
                         //                                DDE client
            final DDEClientConversation conversation = new DDEClientConversation();
                         //                     We can use UNICODE format if server prefers it
         // conversation.setTextFormat( ClipboardFormat.CF_UNICODETEXT );

            conversation.setEventListener( new DDEClientEventListener()
            {
                public void onDisconnect()
                {
                    System.out.println( "onDisconnect()" );
                }

                public void onItemChanged( String topic, String item, String data )
                {
                    System.out.println( "onItemChanged( "
                                      +  topic
                                      + ","
                                      +  item
                                      + ","
                                      +  data.trim()
                                      + ")"
                                         );
                }
            } );

            System.out.println(            "Connecting..." );
            conversation.connect( "Excel", "Sheet1" );
            try
            {            // .startAdvice(-------------------------------
                conversation.startAdvice(  "R1C1" );

                System.out.println(        "Press Enter to quit" );
                System.in.read();

                conversation.stopAdvice(   "R1C1" );
            }            // .stopAdvice(--------------------------------
            finally
            {
                conversation.disconnect();
            }
        }
        catch ( DDEMLException e )
        {
            System.out.println( "DDEMLException: 0x"
                              +  Integer.toHexString( e.getErrorCode() )
                              + " "
                              +  e.getMessage()
                                 );
        }
        catch ( DDEException e )
        {
            System.out.println( "DDEClientException: "
                              +  e.getMessage()
                                 );
        }
        catch ( Exception e )
        {
            System.out.println( "Exception: "
                              +  e
                                 );
        }
    }
}

JDDE - это библиотека на основе JNI, и онатребует библиотеки собственного кода (DLL для Windows).

Итак, DLL (файл == JavaDDE.dll) следует поместить в текущий каталог, из которого вы запускаете свой пример, или вам следуетукажите JVM java.library.path, параметр, указывающий на папку, в которой хранится файл JavaDDE.dll.

Пример:

 java -Djava.library.path="C:\jdde" ExcelExample
...