Программирование PC C#: экспорт/импорт DataGridView в XML и HTML Mon, November 23 2020  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

C#: экспорт/импорт DataGridView в XML и HTML Печать
Добавил(а) microsin   

Здесь будут рассмотрены простые примеры экспорта и импорта данных DataGridView с помощью классов XmlWriter и XmlReader.

[Экспорт DataGridView в XML]

В этом примере сделаем экспорт таблицы DataGridView в XML с помощью класса XmlWriter.

DataGridView to XML

Пример функции, которая сохранит DataGridView в XML:

void SaveToXml(DataGridView dgv, String fn)
{
   XmlWriter writer = null;
 
   try
   {
      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars = ("\t");
      settings.OmitXmlDeclaration = true;
      settings.Encoding = Encoding.UTF8;
      String tmpstr;
 
      writer = XmlWriter.Create(fn, settings);
      // Запись комментария:
      writer.WriteComment(" Пример генерации файла " + fn + " из таблицы DataGridView ");
      writer.WriteStartElement("table");
      // Запись заголовка:
      tmpstr = "";
      int columnidx = dgv.Columns.Count;
      foreach (DataGridViewColumn column in dgv.Columns)
      {
         tmpstr += column.HeaderText;
         if (columnidx > 1)
            tmpstr += ";";
         columnidx--;
      }
      writer.WriteElementString("header", tmpstr);
      // Запись всех строк, итерация по сторокам DataGridViewRow:
      int rowidx = 0;
      foreach (DataGridViewRow row in dgv.Rows)
      {
         String ElementName = "row" + rowidx.ToString();
         tmpstr = "";
         columnidx = dgv.Columns.Count;
         // Запись элементов таблицы в строку с разделителем ';':
         foreach (DataGridViewCell column in row.Cells)
         {
            if (null != column.Value)
               tmpstr += column.Value.ToString();
            if (columnidx > 1)
               tmpstr += ";";
            columnidx--;
         }
         writer.WriteElementString(ElementName, tmpstr);
         rowidx++;
      }
      writer.WriteEndElement();
      writer.Flush();
   }
   finally
   {
      if (writer != null)
         writer.Close();
   }
}

В результате получится вот такой файл:

<!-- Пример генерации файла data.xml из таблицы DataGridView -->
<table>
	<header>Время;Тест;Уст. (мА);Счит. (мА);Точн.;Результат</header>
	<row0>;Начало теста;;;;</row0>
	<row1>13:37:46;Тест 1;;;;</row1>
	<row2>13:38:12;;4.69;4.70;0.0%;ON</row2>
	<row3>13:38:44;;3.23;3.30;0.0%;OFF</row3>
	<row4>13:38:44;Тест 2;;;;</row4>
	<row5>13:39:07;;4.70;4.70;0.0%;ON</row5>
	<row6>13:39:42;;3.24;3.20;-3.0%;OFF</row6>
	<row7>13:39:43;Тест 3;;;;</row7>
	<row8>13:40:06;;4.70;4.70;0.0%;ON</row8>
	<row9>13:40:37;;3.20;3.20;-3.0%;OFF</row9>
	<row10>;Время теста 00:02:51;;;;</row10>
</table>

Пример функции, которая загружает в DataGridView содержимое файла XML:

void LoadFromXml(ref DataGridView dgv, String fn)
{
   XmlReader reader = null;
   dgv.Rows.Clear();
   int rowidx = 0;
 
   try
   {
      XmlReaderSettings settings = new XmlReaderSettings();
 
      reader = XmlReader.Create(fn, settings);
      while (reader.Read())
      {
         switch (reader.NodeType)
         {
         case XmlNodeType.Comment:
            logfile.write(String.Format("Комментарий: {0}", reader.Value));
            break;
         case XmlNodeType.Element:
            if ("header" == reader.Name)
            {
               reader.Read();
               logfile.write("Заголовок: "+ reader.Value);
            }
            break;
         case XmlNodeType.Text:
            String[] words;
            words = reader.Value.Split(new char[] { ';' });
            dgv.Rows.Add();
            int colidx = 0;
            foreach (String str in words)
            {
               dgv.Rows[rowidx].Cells[colidx].Value = str;
               colidx++;
            }
            dgv.CurrentCell = dgv.Rows[rowidx].Cells[0];
            dgv.CurrentCell.Selected = false;
            rowidx++;
            break;
         //case XmlNodeType.EndElement:
         //   logfile.write(String.Format("End Element {0}", reader.Name));
         //   break;
         //default:
         //   logfile.write("Other node " + reader.NodeType.ToString()
         //               + " with value " + reader.Value.ToString());
         //   break;
         }
      }
   }
   finally
   {
      if (reader != null)
         reader.Close();
   }
}

[Экспорт DataGridView в HTML]

Вы наверное догадались, что таким же способом можно легко создавать файлы в формате HTML. И неудивительно, ведь HTML это частный случай XML. Пример:

void SaveToHtml(DataGridView dgv, String fn)
{
   XmlWriter writer = null;
 
   try
   {
      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars = ("\t");
      settings.OmitXmlDeclaration = true;
      settings.Encoding = Encoding.UTF8;
 
      writer = XmlWriter.Create(fn, settings);
      // Запись комментария:
      writer.WriteComment(" Пример генерации файла " + fn + " из таблицы DataGridView ");
      writer.WriteStartElement("table");
      writer.WriteStartElement("tbody");
      // Запись заголовка таблицы HTML:
      writer.WriteStartElement("tr");
      foreach (DataGridViewColumn column in dgv.Columns)
      {
         writer.WriteElementString("th", column.HeaderText);
      }
      writer.WriteEndElement();  // закрытие тега tr
      // Запись всех строк:
      foreach (DataGridViewRow row in dgv.Rows)
      {
         writer.WriteStartElement("tr");
         foreach (DataGridViewCell column in row.Cells)
         {
            if (null != column.Value)
               writer.WriteElementString("td", column.Value.ToString());
            else
               writer.WriteElementString("td", " ");
         }
         writer.WriteEndElement();  // закрытие тега tr
      }
      writer.WriteEndElement();  // закрытие тега tbody
      writer.WriteEndElement();  // закрытие тега table
      writer.Flush();
   }
   finally
   {
      if (writer != null)
         writer.Close();
   }
}

Получится вот такая таблица:

<!-- Пример генерации файла data.html из таблицы DataGridView -->
<table>
	<tbody>
		<tr>
			<th>Время</th>
			<th>Тест</th>
			<th>Уст. (мА)</th>
			<th>Счит. (мА)</th>
			<th>Точн.</th>
			<th>Результат</th>
		</tr>
		<tr>
			<td />
			<td>Начало теста</td>
			<td />
			<td />
			<td />
			<td />
		</tr>
		<tr>
			<td>13:37:46</td>
			<td>Тест 1</td>
			<td />
			<td />
			<td />
			<td />
		</tr>
		...
		<tr>
			<td />
			<td>Время теста 00:02:51</td>
			<td />
			<td />
			<td />
			<td />
		</tr>
	</tbody>
</table>

К формируемым тегам с помощью метода WriteAttributeString можно добавлять атрибуты, что позволяет форматировать текст и таблицу:

      ...
      writer.WriteStartElement("table");
      writer.WriteAttributeString("border", "0");
      writer.WriteAttributeString("cellspacing", "1");
      writer.WriteAttributeString("cellpadding", "3");
      writer.WriteAttributeString("bgcolor", "#8cacbb");
      writer.WriteStartElement("tbody");
      // Запись заголовка таблицы HTML:
      writer.WriteStartElement("tr");
      writer.WriteAttributeString("style", "background-color: #dee7ec;");
      foreach (DataGridViewColumn column in dgv.Columns)
      {
         writer.WriteElementString("th", column.HeaderText);
      }
      writer.WriteEndElement();  // закрытие тега tr
      // Запись всех строк:
      int rowstart = 0;
      int rowidx = rowstart;
      int rowend = dgv.Rows.Count - 1;
      foreach (DataGridViewRow row in dgv.Rows)
      {
         writer.WriteStartElement("tr");
         writer.WriteAttributeString("style", "background-color: #ffffff;");
         foreach (DataGridViewCell column in row.Cells)
         {
            if (null != column.Value)
            {
               writer.WriteStartElement("td");
               if ("ON" == column.Value.ToString())
                  writer.WriteAttributeString("style", "color: #00ff00;");
               else if ("OFF" == column.Value.ToString())
                  writer.WriteAttributeString("style", "color: #ffa000;");
               if (rowidx == rowstart || rowidx == rowend)
               {
                  writer.WriteStartElement("b");
                  writer.WriteStartElement("i");
               }
               writer.WriteString(column.Value.ToString());
               if (rowidx == rowstart || rowidx == rowend)
               {
                  writer.WriteEndElement();  // закрытие тега i
                  writer.WriteEndElement();  // закрытие тега b
               }
               writer.WriteEndElement();  // закрытие тега td
            }
            else
               writer.WriteElementString("td", " ");
         }
         writer.WriteEndElement();  // закрытие тега tr
         rowidx++;
      }
      writer.WriteEndElement();  // закрытие тега tbody
      writer.WriteEndElement();  // закрытие тега table
      writer.Flush();
      ...

Конечный результат экспорта в HTML:

ВремяТестУст. (мА)Счит. (мА)Точн.Результат
Начало теста
13:37:46 Тест 1        
13:38:12   4.69 4.70 0.0% ON
13:38:44   3.23 3.30 0.0% OFF
13:38:44 Тест 2        
13:39:07   4.70 4.70 0.0% ON
13:39:42   3.24 3.20 -3.0% OFF
13:39:43 Тест 3        
13:40:06   4.70 4.70 0.0% ON
13:40:37   3.20 3.20 -3.0% OFF
Время теста 00:02:51

[Ссылки]

1. Visual Studio: как работать с DataGridView.

 

Добавить комментарий


Защитный код
Обновить

Top of Page