Здесь будут рассмотрены простые примеры экспорта и импорта данных DataGridView с помощью классов XmlWriter и XmlReader.
[Экспорт DataGridView в XML]
В этом примере сделаем экспорт таблицы DataGridView в XML с помощью класса XmlWriter.
Пример функции, которая сохранит 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. |