В данной статье мы посмотрим, как сохранять таблицы, в том числе из объекта DataSet, в файл pdf. Итак, для начала создадим обычную базу данных в виде текстового файла (так как это не займет много времени), к которой мы будем затем подключаться и которую будем передавать в объект DataSet. Наша база данных будет представлять обычный текстовый файл под названием Dictionary.txt, содержащий словарь:
Слово, Перевод Red, Красный Orange, Оранжевый Yellow, Желтый Green, Зеленый Blue, Синий Violet, Фиолетовый
Все довольно просто: у нас два столбца, где в качестве разделителя используется запятая. Теперь создадим само приложение. Кинем на форму две кнопки - одну для открытия файла и вывода его в объект DataGridView, а другую - для сохранения в pdf. И добавим объект DataGridView для вывода БД на форму. В итоге это будет выглядеть так (после открытия БД):
Все довольно просто. Теперь самое главное - загрузим и затем добавим в референсы бесплатную библиотеку iTextSharp. Теперь перейдем к коду.
using System; using System.ComponentModel; using System.Data; using System.Text; using System.Windows.Forms; using System.Data.OleDb; using System.IO; using iTextSharp; using iTextSharp.text; using iTextSharp.text.pdf; namespace CreateTableInPdf { public partial class Form1 : Form { //Определяем объект DataSet DataSet MyDataSet = new DataSet(); //Имя каталога открываемого файла БД string catName = ""; //Непосредственное имя самого файла БД string fileName = "";
Здесь мы определили три глобальных переменных, которые нам понадобятся, и подключили необходимые пространства имен. Теперь перейдем к коду открытия базы данных, который будет содержаться в обработчике события нажатия первой кнопки:
//Стандартный код открытия базы данных в программе и вывод таблицы в DatagridView private void button1_Click(object sender, EventArgs e) { //Подключение к БД //Определяем подключение OleDbConnection StrCon; //Строка для выборки данных string Select1; //Создание объекта Command OleDbCommand comand1; //Определяем объект Adapter для взаимодействия с источником данных OleDbDataAdapter adapter1; try { OpenFileDialog ofd =new OpenFileDialog(); if (ofd.ShowDialog() != DialogResult.Cancel) { if (ofd.FileName!=null) { catName = ofd.FileName.Remove(ofd.FileName.LastIndexOf("\")); fileName = ofd.FileName.Remove(0, ofd.FileName.LastIndexOf("\") + 1); Select1 = "SELECT * FROM [" + fileName + "]"; //Создаем подключение StrCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + catName + ";Extended Properties=text"); comand1 = new OleDbCommand(Select1, StrCon); adapter1 = new OleDbDataAdapter(comand1); //Открываем подключение StrCon.Open(); adapter1.Fill(MyDataSet); //Заполняем обект datagridview для отображения данных на форме dataGridView1.DataSource = MyDataSet.Tables[0]; StrCon.Close(); } } } catch (Exception ex) { MessageBox.Show("Возникла ошибка : " + ex.Message); } }
Здесь мы при нажатии на кнопку находим в проводнике наш файл Dictionary.txt и подключаемся к нему. Тепрерь код нажатия на вторую кнопку, где мы будем сохранять таблицу из БД в файл pdf:
// Само сохранение в пдф private void button2_Click(object sender, EventArgs e) { //Объект документа пдф iTextSharp.text.Document doc =new iTextSharp.text.Document(); //Создаем объект записи пдф-документа в файл PdfWriter.GetInstance(doc, new FileStream("pdfTables.pdf", FileMode.Create)); //Открываем документ doc.Open(); //Определение шрифта необходимо для сохранения кириллического текста //Иначе мы не увидим кириллический текст //Если мы работаем только с англоязычными текстами, то шрифт можно не указывать BaseFont baseFont = BaseFont.CreateFont("C:\Windows\Fonts\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, iTextSharp.text.Font.DEFAULTSIZE, iTextSharp.text.Font.NORMAL); //Обход по всем таблицам датасета (хотя в данном случае мы можем опустить //Так как в нашей бд только одна таблица) for(int i = 0;i< MyDataSet.Tables.Count;i++) { //Создаем объект таблицы и передаем в нее число столбцов таблицы из нашего датасета PdfPTable table =new PdfPTable(MyDataSet.Tables[i].Columns.Count); //Добавим в таблицу общий заголовок PdfPCell cell = new PdfPCell(new Phrase("БД " + fileName + ", таблица №" + (i + 1), font)); cell.Colspan = MyDataSet.Tables[i].Columns.Count; cell.HorizontalAlignment = 1; //Убираем границу первой ячейки, чтобы балы как заголовок cell.Border = 0; table.AddCell(cell); //Сначала добавляем заголовки таблицы for(int j = 0; j< MyDataSet.Tables[i].Columns.Count;j++) { cell = new PdfPCell(new Phrase(new Phrase(MyDataSet.Tables[i].Columns[j].ColumnName, font))); //Фоновый цвет (необязательно, просто сделаем по красивее) cell.BackgroundColor = iTextSharp.text.BaseColor.LIGHT_GRAY; table.AddCell(cell); } //Добавляем все остальные ячейки for(int j = 0; j< MyDataSet.Tables[i].Rows.Count;j++) { for(int k = 0; k< MyDataSet.Tables[i].Columns.Count;k++) { table.AddCell(new Phrase(MyDataSet.Tables[i].Rows[j][k].ToString(), font)); } } //Добавляем таблицу в документ doc.Add(table); } //Закрываем документ doc.Close(); MessageBox.Show("Pdf-документ сохранен"); }
В данном случае обход таблиц был излишним, так как у нас по сути одна таблица (она же имя файла) - Dictionary. Обход таблиц сделан, чтобы показать, как сохранять все таблицы, если в БД несколько таблиц. Также обратите внимание на определение шрифта. Если у нас нет кириллических символов, нам шрифт использовать необязательно.
После сохранения вы увидите в папке приложения соданный документ pdfTables.pdf, который будет выглядеть примерно так: