将datagridview保存到csv

时间:2017-10-21 18:03:04

标签: c# csv datagridview

问题在于我想要对我之前保存excel中数据库数据的程序所做的工作,现在它用逗号分隔的参数来完成。我在StackOverflow中搜索了一些示例,但是我得到了很好的结果但是仍然无法让我的代码完成我需要的操作。 我留下完整的代码。

我留下参考代码,但我需要帮助的是私有的无效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)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:0)

史蒂夫指出,发布的代码正在尝试打印没有列或行的DataGridView。特别是在第4行的SaveToCSV方法中,有以下代码行...

DataGridView dataGridViewResults = new DataGridView();

这会创建一个没有列或行的新DataGridView。在代码之后......网格永远不会给出列或行,如果你跟踪代码,你会发现它永远不会进入任何for循环。因此,会创建一个空文件,

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

为了解决问题,辅助方法GetCommaDelimitedRow对行索引采用DataGridViewint,并在给定行索引处从网格返回逗号分隔的字符串。如果行索引小于零(0),则返回grids列标题中逗号分隔的字符串。此方法使用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");
}