【问题标题】:Save datagridview to csv将数据网格视图保存到 csv
【发布时间】:2017-10-21 18:03:03
【问题描述】:

问题是我想要我以前的程序在 excel 中保存数据库的数据,现在它在用逗号分隔的参数中执行它。我已经在 StackOverflow 中搜索了示例,并且取得了不错的结果,但我仍然无法让我的代码完成我需要的工作。 我留下我的完整代码。

我留下了参考代码,但我需要帮助的是 private void SaveToCSV()

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IniFile;
using Microsoft.Office.Interop.Excel;
using SGP_Base.Classes;
using Application = Microsoft.Office.Interop.Excel.Application;


namespace MES_SERVER
{
    public partial class FrmSerialAllResults : Form
    {
        public FrmSerialAllResults()
        {
            InitializeComponent();
            LoadDatas();
            CargarPermisos();
        }
        private void LoadDatas()
        {
            dataGridViewResults.Rows.Clear();
            serial_resultados serialResultados = new serial_resultados();
            serialResultados.SeleccionarDatos("");
            DatagridView(serialResultados, "No existen Resultados", serialResultados.Filas().Count - 50);
        }
        private void CargarPermisos()
        {
            Permisos permisos = new Permisos();
            Dictionary<string, object> parameters = new Dictionary<string, object>();
            parameters.Add("@objetos1", "Exportar a excel");
            permisos.SeleccionarDatos("objetos =@objetos1", parameters);
            buttonExportExcel.Enabled= Convert.ToBoolean(int.Parse(permisos.Filas()[0].Celda(Global.level).ToString()));
        }
        private void DatagridView(serial_resultados serialResultados, string mensaje, int total)
        {
            if (serialResultados.TieneFilas())
            {
                //int inicio = serialResultados.Filas().Count - 50;
                int inicio = total;
                int k = 0;
                foreach (Fila fila in serialResultados.Filas())
                {
                    if (k >= inicio)
                    {
                        dataGridViewResults.Rows.Add(fila.Celda("id"), fila.Celda("fecha"), fila.Celda("serial"),
                            fila.Celda("estacion"), " ", fila.Celda("status"),
                            fila.Celda("distancia"), fila.Celda("fuerza"), fila.Celda("vacio"), fila.Celda("presion"),
                            fila.Celda("tiempociclo"),
                            fila.Celda("total_ensamblados"), fila.Celda("ensamblado_a"));
                    }
                    k++;
                }
                for (int i = 0; i < dataGridViewResults.Rows.Count; i++)
                {
                    if (int.Parse(dataGridViewResults["Status", i].Value.ToString()) == 0)
                    {
                        dataGridViewResults["Status", i].Value = "NOK";
                        dataGridViewResults["Status", i].Style.BackColor = Color.OrangeRed;
                        dataGridViewResults["Status", i].Style.ForeColor = Color.White;
                    }
                    else
                    {
                        dataGridViewResults["Status", i].Value = "OK";
                        dataGridViewResults["Status", i].Style.BackColor = Color.LimeGreen;
                    }
                    string station = dataGridViewResults["Station", i].Value.ToString();
                    string newName =ObtenerNombre(station);
                    dataGridViewResults["nombre", i].Value = newName;
                }
                toolStripStatusLabelCounRows.Text = "Filas Totales: " + serialResultados.Filas().Count.ToString();
            }
            else
            {
                MessageBox.Show(mensaje, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private string ObtenerNombre(string estation)
        {
            string numberstation = estation.Replace("E", "");
            Ini ini = new Ini(Global.PathFileIni);
            string name =ini.IniReadValue("Maquina" + numberstation, "Name");
            return name;
        }
        private string ObtenerEstacion(string name)
        {
            string pathFile = Global.PathFileIni;
            if (File.Exists(pathFile))
            {
                Ini ini = new Ini(pathFile);
                string valor = ini.IniReadValue("NumberTotalMachine", "Total");
                if (valor != "")
                {
                    int total = int.Parse(valor);
                    for (int i = 1; i <= total; i++)
                    {
                        if (ini.IniReadValue("Maquina" + i, "Name") == name)
                        {
                            return "E" + i;
                        }
                    }
                }
            }
            return "";
        }
        private void buttonExportExcel_Click(object sender, EventArgs e)
        {
            try
            {
                //SaveExcel();
                 SaveToCSV();
            }
            catch{}
        }

         private void SaveToCSV()
         {

             string dataDay = DateTime.Today.ToString().Replace("/", "");
             dataDay = dataDay.Replace(":", "");
             dataDay = dataDay.Replace(" ", "");

             DataGridView dataGridViewResults = new DataGridView();
             SaveFileDialog sfd = new SaveFileDialog();
             string filename = "";
             string filter = "CSV file (*.csv)|*.csv| All Files (*.*)|*.*";
             sfd.FileName = "Registro_" + dataDay + ".csv";
             sfd.Filter = filter;


             if (sfd.ShowDialog() == DialogResult.OK)
             {
                 MessageBox.Show("Se estan exportando sus datos, se notificara cuando este listo");
                 if (File.Exists(filename))
                 {
                     try
                     {
                         File.Delete(filename);
                     }
                     catch (IOException ex)
                     {
                         MessageBox.Show("No fue posible escribir los datos en el disco" + ex.Message);
                     }
                 }
                 int columnCount = dataGridViewResults.ColumnCount;
                 string columnNames = "";
                 string[] output = new string[dataGridViewResults.RowCount + 1];
                 for (int i = 1; (i - 1) < dataGridViewResults.RowCount; i++)
                 {


                     columnNames += dataGridViewResults.Columns[i].Name.ToString() + ",";
                 }
                 output[0] += columnNames;
                 for (int i = 1; (i - 1) < dataGridViewResults.RowCount; i++)
                 {
                     for (int j = 0; j < columnCount; j++)
                     {

                        output[i] += dataGridViewResults.Rows[i - 1].Cells[j].Value.ToString() + "/n";
                     }
                 }
                 System.IO.File.WriteAllLines(sfd.FileName, output, System.Text.Encoding.UTF8);
                 MessageBox.Show("El archivo esta listo para su uso");
             }
         } 

    /*    private void SaveExcel()
        {
            string dataDay = DateTime.Today.ToString().Replace("/", "");
            dataDay = dataDay.Replace(":", "");
            dataDay = dataDay.Replace(" ", "");

            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Excel Documents(*.xls)|*.xls";
            saveFileDialog.FileName = "Registro_" + dataDay + ".xls";
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                object Value = System.Reflection.Missing.Value;
                Application excelApplication = new Application();
                excelApplication.Visible = true;
                Workbook workbook = excelApplication.Workbooks.Add(Value);
                Worksheet worksheet = (Worksheet)workbook.Sheets["Sheet1"];
                worksheet = (Worksheet)workbook.ActiveSheet;
                worksheet.Cells[1, 1] = "Fecha";
                worksheet.Cells[1, 2] = "Serial";
                worksheet.Cells[1, 3] = "Estacion";
                worksheet.Cells[1, 4] = "Nombre";
                worksheet.Cells[1, 5] = "Estatus";
                worksheet.Cells[1, 6] = "Distancia";
                worksheet.Cells[1, 7] = "Fuerza";
                worksheet.Cells[1, 8] = "Vacio";
                worksheet.Cells[1, 9] = "Presion";
                worksheet.Cells[1, 10] = "Tiempo de ciclo";
                worksheet.Cells[1, 11] = "Total ensamblados";
                worksheet.Cells[1, 12] = "Ensamblado a";
                int FilasCount = dataGridViewResults.RowCount;
                int k = 2;
                for (int i = 0; i < FilasCount; i++)
                {
                    worksheet.Cells[k, 1] = dataGridViewResults["fecha", i].Value.ToString();
                    worksheet.Cells[k, 2] = dataGridViewResults["serial", i].Value.ToString();
                    worksheet.Cells[k, 3] = dataGridViewResults["Station", i].Value.ToString();
                    worksheet.Cells[k, 4] = dataGridViewResults["nombre", i].Value.ToString();
                    worksheet.Cells[k, 5] = dataGridViewResults["Status", i].Value.ToString();
                    worksheet.Cells[k, 6] = dataGridViewResults["distancia", i].Value.ToString();
                    worksheet.Cells[k, 7] = dataGridViewResults["fuerza", i].Value.ToString();
                    worksheet.Cells[k, 8] = dataGridViewResults["vacio", i].Value.ToString();
                    worksheet.Cells[k, 9] = dataGridViewResults["presion", i].Value.ToString();
                    worksheet.Cells[k, 10] = dataGridViewResults["tiempociclo", i].Value.ToString();
                    worksheet.Cells[k, 11] = dataGridViewResults["totalensambles", i].Value.ToString();
                    worksheet.Cells[k, 12] = dataGridViewResults["ensamblado_a", i].Value.ToString();
                    k++;
                }
                workbook.SaveAs(saveFileDialog.FileName, XlFileFormat.xlWorkbookNormal, Value, Value, Value, Value, XlSaveAsAccessMode.xlExclusive, Value, Value, Value, Value, Value);
                workbook.Close(true, Value, Value);
                excelApplication.Quit();
            }
        } */
        private void textBoxEstación_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (textBoxEstación.Text != "")
                    SearchEstacion();
                else
                    LoadDatas();
                textBoxEstación.Text = "";
            }
        }
        private void SearchEstacion()
        {
            string estacion = ObtenerEstacion(textBoxEstación.Text);
            if (estacion == "")
                estacion = textBoxEstación.Text;
            dataGridViewResults.Rows.Clear();
            serial_resultados serialResultados = new serial_resultados();
            serialResultados.SeleccionarDatos("estacion='" + estacion + "'");
            DatagridView(serialResultados, "No existen datos para " + textBoxEstación.Text,0);
        }
        private void textBoxSerial_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (textBoxSerial.Text != "")
                    SearchSerial();
                else
                    LoadDatas();
                textBoxSerial.Text = "";
            }
        }
        private void SearchSerial()
        {
            dataGridViewResults.Rows.Clear();
            serial_resultados serialResultados = new serial_resultados();
            serialResultados.SeleccionarDatos("serial LIKE '%" + textBoxSerial.Text + "%'");
            DatagridView(serialResultados, "No existen datos para " + textBoxSerial.Text, 0);
        }
        private void textBoxEnsamble_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (textBoxEnsamble.Text != "")
                    SearchEnsamble();
                else
                    LoadDatas();
                textBoxEnsamble.Text = "";
            }
        }
        private void SearchEnsamble()
        {
            dataGridViewResults.Rows.Clear();
            serial_resultados serialResultados = new serial_resultados();
            serialResultados.SeleccionarDatos("ensamblado_a LIKE '%" + textBoxEnsamble.Text + "%'");
            DatagridView(serialResultados, "No existen datos para " + textBoxEnsamble.Text,0);
        }
        private void buttonReload_Click(object sender, EventArgs e)
        {
            LoadDatas();
        }
        private void dateTimePicker1_CloseUp(object sender, EventArgs e)
        {
            SearchDateTime();
        }
        private void SearchDateTime()
        {
            string Formato = "yyyy-MM-dd";
            string Date = dateTimePicker1.Value.ToString(Formato);
            dataGridViewResults.Rows.Clear();
            serial_resultados serialResultados = new serial_resultados();
            serialResultados.SeleccionarDatos("fecha LIKE '%" + Date + "%'");
            DatagridView(serialResultados, "No existen datos de la fecha " + Date,0);
        }

        private void dataGridViewResults_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}

【问题讨论】:

  • 你能留下与你的问题相关的代码吗?查看代码墙并不能帮助任何人找到您的问题。还有什么不能与你的代码一起工作?
  • 我现在可以看到它:这一行 DataGridView dataGridViewResults = new DataGridView(); 创建了一个名为 DataGridViewResults 的网格,但您永远不会用数据填充它。因此,当您遍历该网格行时,您无需将任何内容写入文件。
  • 我完全不明白你的意思,你能给我举个例子吗?由于我很好地引用了上一个程序中将内容保存在 excel 中的函数,所以一切都运行良好

标签: c# csv datagridview


【解决方案1】:

正如史蒂夫指出的那样,发布的代码试图打印一个没有列或行的DataGridView。特别是在第 4 行的SaveToCSV 方法中,有以下代码行……

DataGridView dataGridViewResults = new DataGridView();

这将创建一个没有列或行的新 DataGridView。遵循代码...网格永远不会被赋予列或行,如果您跟踪代码,您会注意到它永远不会进入任何for 循环。因此,创建了一个空文件,

有很多方法可以将DataGridView 的单元格写入 csv 文件。如果网格有数据源并使用它而不是遍历网格,通常会更容易。但是,如果您想按照您的描述将网格内容写入 csv 文件,下面的代码可能会有所帮助。

为了解决这个问题,辅助方法GetCommaDelimitedRow 采用DataGridViewint 作为行索引,并从给定行索引处的网格返回一个逗号分隔的字符串。如果行索引小于零 (0),则返回来自网格列标题的逗号分隔字符串。此方法使用StringBuilder 在每个值之后附加“分隔符”“,”,但不希望使用尾随逗号的最后一列除外。

PrintGridToCSV 方法采用 DataGridViewstring 写入路径/文件名。 StringBuilder 用于代替字符串数组,这样字符串构建器中的每一行都是网格中以逗号分隔的行。首先检查以确保网格不为空,至少有一 (1) 列和至少一 (1) 行。如果有列和行,请使用辅助方法添加列标题行,并将 -1 作为行索引。然后遍历行并使用辅助方法将这些字符串添加到字符串生成器。最后使用WriteAllText 方法将字符串生成器写入文件。我希望这会有所帮助。

private string GetCommaDelimitedRow(DataGridView grid, int rowIndex) {
  StringBuilder sb = new StringBuilder();
  for (int curCol = 0; curCol < grid.Columns.Count; curCol++) {
    if (rowIndex < 0)
      sb.Append(grid.Columns[curCol].Name);
    else {
      if (grid.Rows[rowIndex].Cells[curCol].Value != null) {
        sb.Append(grid.Rows[rowIndex].Cells[curCol].Value.ToString());
      }
      else {
        sb.Append("");
      }
    }
    // if this col is not the last column... add a delimiter ','
    if (curCol < grid.Columns.Count - 1)
      sb.Append(",");
  }
  return sb.ToString();
}

PrintGridToCSV 方法

private void PrintGridToCSV(DataGridView grid, string fileName) {
  if (grid != null && grid.Columns.Count > 0 && grid.Rows.Count > 0) {
    StringBuilder sb = new StringBuilder();
    sb.AppendLine(GetCommaDelimitedRow(grid, -1));  // <- add column headers row
    for (int i = 0; i < grid.Rows.Count; i++) {
      if (!grid.Rows[i].IsNewRow)
        sb.AppendLine(GetCommaDelimitedRow(grid, i)); // <- add row data
    }
    try {
      File.WriteAllText(fileName, sb.ToString(), Encoding.UTF8);
    }
    catch (Exception e) {
      MessageBox.Show("File write error: " + e.Message);
    }
  }
  else
    MessageBox.Show("Grid is null... has no columns or has no rows or both!");
}

private void button1_Click(object sender, EventArgs e) {
  PrintGridToCSV(dataGridView1, @"D:\Test\_MyCSVFile.csv");
}

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多