Как читать динамически изменяющиеся значения из листа 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