es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conecte los puntos vacíos en el gráfico de Word.

Estoy creando un gráfico en mi aplicación de C# con Word Interop. Dentro de este gráfico, tengo algunos puntos de datos vacíos. ¿Cómo puedo conectar los puntos vacíos programáticamente? Me gustaría lograr esto, pero dentro del código. ¿Alguien puede ayudarme? Gracias.

Edit:
Aquí está el código:

Dictionary<datetime,></datetime,><string, decimal="">> visuData = new Dictionary<datetime,></datetime,><string, decimal="">>(); 
string startTime = null;
string endTime = null;

// Variables para el intervalo de tiempo desde el cual se extraerán los datos de prueba:
query = "SELECT MIN(Starttime) AS Starttime, MAX(Starttime) AS Endtime FROM dbo.Table WHERE ID = "+checkBox.Text;
con = new SqlConnection(mtecConnectionString);
cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    startTime = reader.GetDateTime(0).ToString("yyyy-MM-dd hh:mm:ss.fff");
    endTime = reader.GetDateTime(1).ToString("yyyy-MM-dd hh:mm:ss.fff");
}
con.Close();

// Se determina el intervalo de tiempo
if (startTime == null || endTime == null)
    return; // Si no hay datos, se detiene el método.

List<string> variables = new List<string>();
query = "SELECT ...";
con = new SqlConnection(@"...");
cmd = new SqlCommand(query, con);
con.Open();

// Se hacen las consultas para los datos de prueba y se establece la conexión a la base de datos:
reader = cmd.ExecuteReader();
while (reader.Read())
{
    if (visuData.ContainsKey(reader.GetDateTime(2)))
    {
        visuData[reader.GetDateTime(2)].Add(reader.GetString(0), reader.GetDecimal(1));
    }
    else
    {
        visuData.Add(reader.GetDateTime(2), new Dictionary<string, decimal="">());
        visuData[reader.GetDateTime(2)].Add(reader.GetString(0), reader.GetDecimal(1));
    }

    if (!variables.Contains(reader.GetString(0)))
        variables.Add(reader.GetString(0));
}
con.Close();

// Se crea el gráfico en el documento de Word
Chart chart = document.InlineShapes.AddChart2(-1, XlChartType.xlLineMarkers, paragraph.Range).Chart;
Microsoft.Office.Interop.Excel.Workbook excelWorkbook = chart.ChartData.Workbook;
excelWorkbook.Application.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMinimized;
Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = excelWorkbook.Worksheets[1];

// Se escriben los nombres de las variables en la primera fila de la hoja de cálculo
for(int j = 2; j < variables.Count + 2; j++)
{
    excelWorksheet.Cells[1, j].Value = variables[j - 2];
}

// Se escriben los datos en la hoja de cálculo, fila por fila.
int rowIndex = 2;
foreach (DateTime moment in visuData.Keys)
{
    excelWorksheet.Cells[rowIndex, 1].Value = moment.ToString("HH:mm:ss");
    for(int j = 2; j < variables.Count + 2; j++)
    {
        if (visuData[moment].ContainsKey(variables[j - 2]))
            excelWorksheet.Cells[rowIndex, j].Value = visuData[moment][variables[j - 2]];
    }
    rowIndex += 1;
}

chart.ChartTitle.Text = "Batch ID " + checkBox.Text;
chart.Refresh();
excelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);

Quiero mostrar algunas variables a lo largo del tiempo. Así que creé un diccionario con la marca de tiempo como clave y otro diccionario como valor. Dentro de este segundo diccionario, estoy usando la clave para identificar la variable y el valor para obtener el valor.

Se ve así:

2021-12-02 08:00:00 -> Var 1: 1

2021-12-02 08:00:00 -> Var 2: 2

2021-12-02 08:05:00 -> Var 1: 3

2021-12-02 08:05:00 -> Var 3: 4

El problema es que en el gráfico generado, para Var 3 se muestra el valor 0 a las 8 am, pero no quiero ningún valor para Var 3 a las 8 am. Lo mismo sucede con Var 2…

Espero que esté más claro ahora.</string,></string,></string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para conectar los puntos de datos vacíos en tu aplicación de C#, con la Interop de Word, puedes utilizar el método Chart.ChartWizard en combinación con la constante ChartConstants.xlDataLabelsShowLabelWithValue. Esto añadirá etiquetas de datos a tu gráfico y conectará los puntos de datos vacíos.

    Aquí te mostramos un ejemplo de código que demuestra cómo lograr esto:

    // supongamos que tienes un objeto Chart llamado 'chart' y quieres conectar los puntos de datos vacíos
    // primero, agrega las etiquetas de datos al gráfico
    chart.ApplyDataLabels(Microsoft.Office.Interop.Word.XlDataLabelsType.xlDataLabelsShowLabelWithValue);
    
    // luego, ajusta el formato de la etiqueta de datos para mostrar solo para las celdas no vacías
    foreach (Microsoft.Office.Interop.Word.Series series in chart.SeriesCollection())
    {
      foreach (Microsoft.Office.Interop.Word.Point point in series.Points())
      {
        if (point.DataLabel() != null)
        {
          if (point.DataLabel().Text() == "")
          {
            point.DataLabel().Delete();
          }
        }
      }
    }
    

    Este código asume que tu gráfico tiene una serie de puntos de datos, cada uno con su propia etiqueta. El método ApplyDataLabels agrega etiquetas de datos al gráfico, y la constante xlDataLabelsShowLabelWithValue establece el formato de la etiqueta para mostrar la etiqueta y el valor de cada punto de datos.

    La segunda sección del código itera sobre cada serie y punto en el gráfico, y verifica si la etiqueta de datos no es nula y está vacía. Si la etiqueta está vacía, la borra. Esto eliminará la etiqueta para los puntos de datos vacíos y conectará los puntos restantes en el gráfico.

Comments are closed.