Tabla Excel en Tiempo Real

En esta entrada vamos a ver como mostrar, en Excel, una tabla como la de Visual Chart y actualizarla en tiempo real.

El proyecto permite seleccionar una tabla de Visual Chart, como en el proyecto de las tablas que vimos en un post anterior para, a continuación, monitorizar todos sus símbolos e ir mostrando sus valores en un archivo Excel.

Estos son los objetos que tiene la ventana:

private VisualChart _visualChart;

private string[] _simbolos;

private Excel.Worksheet _hoja;

El objeto VisualChart de STMT es el punto de partida para el control de todas las operaciones con Visual Chart. Se usa para obtener las tablas de Visual Chart y monitorizar los símbolos.

Como las tablas pueden no estar actualizadas, se hace una consulta de símbolos para obtener los símbolos de la tabla. Estos símbolos son los que luego se actualizan.

En _hoja se almacena la hoja de Excel donde se escriben los símbolos y sus valores.

La carga de las tablas ya se vio en un post anterior al igual que la creación de un archivo Excel. Veamos la parte donde se rellena la tabla Excel y donde se actualiza.

private void CrearTablaExcelButton_Click(object sender, EventArgs e)
{
   Table tabla = ObtenerTablaSeleccionada();
   if (tabla == null)
      return;

   CrearTablaExcelButton.Enabled = false;
   ListBoxTablas.Enabled = false;
   TreeCarpetas.Enabled = false;

   Excel.Application excel = CrearExcel(out _hoja);
   if (excel == null)
      return;

   Field[] campos = new Field[]
   {
      Field.Code,
      Field.Description,
      Field.Time,
      Field.Last,
      Field.Diff,
      Field.DiffPorcentual,
      Field.Bid,
      Field.Ask,
      Field.Maximum,
      Field.Minimum
   };
   EstablecerCelda("A1", "Símbolo");
   EstablecerCelda("B1", "Descripción");
   EstablecerCelda("C1", "Hora");
   EstablecerCelda("D1", "Último");
   EstablecerCelda("E1", "Dif.");
   EstablecerCelda("F1", "Dif. %");
   EstablecerCelda("G1", "Compra1");
   EstablecerCelda("H1", "Venta1");
   EstablecerCelda("I1", "Máximo");
   EstablecerCelda("J1", "Mínimo");

   _simbolos = _visualChart.RealTime.FindSymbols(tabla.Query);
   for (int i = 0; i < _simbolos.Length; i++)
   {
      string simbolo = _simbolos[i];
      EstablecerCelda("A" + (i + 2), simbolo);
      _visualChart.RealTime.RequestFields(simbolo, campos);
   }

   Reloj.Enabled = true;
}

La parte inicial es bastante clara: se obtiene la tabla seleccionada en el control de lista y se crea un archivo Excel. Después se crea una lista con los campos a monitorizar (los mismos que en Visual Chart aunque pueden añadirse los que se deseen).

Escribimos la cabecera de la tabla en Excel usando la función EstablecerCelda:

private void EstablecerCelda(string celda, object valor)
{
   try
   {
      _hoja.get_Range(celda).Value = valor;
   }
   catch (COMException)
   {
   }
   catch (InvalidCastException)
   {
   }
}

Es una función muy simple, creada para simplificar el código. Si se produce alguna excepción en la comunicación con Excel, la aplicación no fallará. En el siguiente intervalo de tiempo, se volverá a intentar establecer el valor

Tras escribir la cabecera, se hace una consulta de símbolos para obtener los símbolos de la tabla seleccionada.

Escribimos todos los símbolos en la primera columna de Excel y monitorizamos en tiempo real los símbolos invocando RequestFields con la lista de campos establecida.

Por último, habilitamos el reloj para que se ejecute el método Reloj_Tick cada segundo.

private void Reloj_Tick(object sender, EventArgs e)
{
   Reloj.Enabled = false;

   for (int i = 0; i < _simbolos.Length; i++)
   {
      string simbolo = _simbolos[i];
      SymbolInfo info = _visualChart.RealTime[simbolo];

      string fila = (i + 2).ToString();
      EstablecerCelda("B" + fila, info.Description);
      EstablecerCelda("C" + fila, info.Time.ToString());
      EstablecerCelda("D" + fila, FormatearDouble(info.Last));
      EstablecerCelda("E" + fila, FormatearDouble(info.Diff));
      EstablecerCelda("F" + fila, FormatearDouble(info.DiffPorcentual));
      EstablecerCelda("G" + fila, FormatearDouble(info.BidPrice));
      EstablecerCelda("H" + fila, FormatearDouble(info.AskPrice));
      EstablecerCelda("I" + fila, FormatearDouble(info.Maximum));
      EstablecerCelda("J" + fila, FormatearDouble(info.Minimum));
   }

   Reloj.Enabled = true;
}

Cada vez que se ejecuta este método, se recorre la lista de símbolos obteniendo el objeto SymbolInfo que permite acceder a los campos actualizados para rellenar la hoja Excel.

Si la operación que se ejecuta en este método tarda mucho, podría ejecutarse el método mientras todavía estamos ejecutándolo. Para evitar esto, mientras ejecutamos el método se desactiva el reloj.

Como acabamos de ver, realmente la actualización no se lleva a cabo en tiempo real sino cada cierto tiempo, el configurado en el objeto Timer de la ventana. Esto es así porque la actualización en Excel en tiempo real puede suponer una carga excesiva. Hay mecanismos algo más complejos para mostrar datos en tiempo real en Excel. Si alguien está interesado, que me lo haga saber.

Aunque este ejemplo es muy simple, con un poco más de código podemos generar aplicaciones bastante útiles. Por ejemplo, se puede crear una aplicación que seleccione un archivo de Excel, lo abra y lea los símbolos de la tabla. Se monitoricen y los actualice.

Esto permite añadir fórmulas de Excel que nos sean de utilidad al archivo y no perderlas en cada ejecución de la aplicación.

Archivo Zip Descargar C# TablaExcelRT.zip.

Archivo Zip Descargar VB .NET TablaExcelRT_vb.zip.

Si te ha gustado la entrada, considera hacer una donación Donar. ¿Por qué donar?

Esta entrada fue publicada en Código fuente, Programación, STMT y etiquetada , , , . Guarda el enlace permanente.

Deja un comentario