?
Раздел 10. Глава 2. Возможности формирования XML файлов для их последующего отображения в Explorer, Word и Excel
Параграф 1. Общие замечания по приведенным примерамПостановка задачи для разработчика выглядела примерно так:
Как результат анализа возможностей формирования XML файлов для их последующего отображения в Word и Excel был написан данный материал. В данном материале использована рабочая база "Meteo" одной из организаций. Однако нет никаких ограничений на отображаемый материал. Вполне подойдет для повторения примеров и база Pubs с продавцами и покупателями (но уж больно они всем надоели за период многолетнего тиражирования примеров). Поэтому, просто рекомендуется сделать Select из любой доступной Вам таблицы, с тем, чтобы было выбрано несколько строк и столбцов. Кроме того, рекомендуется изменить названия столбцов и дать им национальные имена, что позволит уточнить аспекты использования национальных кодировок. Создадим простой Web сайт, например, с именем W5 (см. раздел "Создание Web приложений в Microsoft Visual Studio 2005") и поместим на страницу контрол GridView и несколько контролов Button (начнем с одного, и будем добавлять по мере надобности). Выберем в GridView тот материал, который мы будем отображать в XML файл: using System.Data.SqlClient; //Понадобятся позже using System.Text; using System.IO; using System.Xml; ..... protected void Page_Load(object sender, EventArgs e) { using (SqlConnection sqlConn = new SqlConnection(connStr)) { SqlCommand sqlcmd = new SqlCommand(sSql, sqlConn); sqlcmd.CommandType = CommandType.Text; DataSet MyDataSet = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(sqlcmd); da.Fill(MyDataSet); GridView1.DataSource = MyDataSet.Tables[0].DefaultView; GridView1.DataBind(); } } ConnectionString зависит от базы, а для Select использована следующая строка, определенная в области задания глобальных переменных класса (в реальной задаче необходимым будет использования параметров для областей и дат): public partial class _Default : System.Web.UI.Page { private string sSql = "SELECT mp.name_city as \"Город\","+ "r.measured AS \"Дата-Время\",r.temperature AS \"Температура\","+ "c.value AS \"Облачность\", ri.value AS \"Осадки\" "+ "FROM ReportFacts AS r LEFT OUTER JOIN clouds AS c "+ "ON c.idcloud = r.cloud LEFT OUTER JOIN "+ "rains AS ri ON ri.idraind = r.rain "+ "LEFT OUTER JOIN MeasurementPoints as mp "+ "on mp.point_code=r.point_code "+ "WHERE (r.point_code = 95 or r.point_code = 94) AND " "(r.measured >= '20060712 00:00') "+ "AND (r.measured <= '20060712 23:00') ORDER BY r.point_code"; ...... Выборка, по которой будем формировать XML файл, показана на Рис.1:
Рис.1 Выборка из БД Meteo для формирования XML файлов Параграф 2. DataSet и формирование XML файловСамый простой способ сформировать XML файл - использовать встроенный метод DataSet WriteXml: protected void Button1_Click(object sender, EventArgs e) { using(SqlConnection sqlConn = new SqlConnection(connStr)) { SqlCommand sqlcmd = new SqlCommand(sSql,sqlConn); sqlcmd.CommandType = CommandType.Text; DataSet MyDataSet = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(sqlcmd); da.Fill(MyDataSet); MyDataSet.WriteXml(Server.MapPath("1.xml"), XmlWriteMode.IgnoreSchema); } } Но это не совсем решение поставленной задачи. В табличном виде файл открывается только в Excel, причем с несовсем тем форматированием, которое мы бы хотели видеть (включая и при записи с XmlWriteMode WriteSchema и DiffGram). Стандартно при выборке файла он открывается в Explorer (Рис.2), а при открытии в Word отображается только как xml файл (аналог Рис.2 - только приятно подкрашенный). Сам файл формируется в Unicode. И, в конечном итоге, данный метод не совсем приемлем, когда мы вынуждены добавлять что-то к содержимому документа или использовать несколько источников данных, среди которых не только таблицы БД.
Рис.2 XML файл, сформированный DataSet.WriteXml По перечисленным причинам, мы рассмотрим методы программного формирования документов, обратив особое внимание на создание XML файлов с табличными данными для отображения в Word. Параграф 3. Формирование XML файла в виде текстовой строки и классов TextWriter и StreamWriter для записиПрежде чем начать формировать строку, содержащую элементы XML документа, напомним, что Word и Excel, при сохранении введенной информации как XML файл, полностью формирует все необходимые элементы и их параметры. Поэтому, прежде чем начать творить XML файл, откроем Word или Excel 2003 и наберем в новом файле информацию, структурно схожую с той, которую нам необходимо вывести (для таблицы, например, заголовок и одну строку и т.п.). Внесем все требуемое форматирование и сохраним файл как документ (таблицу) XML. Очень громоздкий текстовый файл будет содержать все тэги, все форматирование, стили и т.п. и много-много чего лишнего. Останется только убрать лишнее (к сожалению, задача не из простых). Воспользовавшись этим методом, вставим в Word табличку 2*2 ячейки. заполним ее и сохраним. Получим файл весом более 4K. Делать строку такого размера несколько накладно Возможно, отбрасывая лишнее, довести его до ~ 500-700K (зависит от форматирования). Самый минимум, который мы воплотим в коде, показан ниже: <?xml version="1.0" encoding = "windows-1251" ?> //Строка необхлдима, чтобы перехватить у Explorer вывод в Word <?mso-application progid=\"Word.Document\"?> //Определение документа и пространства имен <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"> <w:body> //Сама таьличка <w:tbl> <w:tr> <w:tc> <w:p> <w:r> <w:rPr> <w:b w:val="on" /></w:rPr> <w:t>Город</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:p> <w:r> <w:rPr> <w:b w:val="on" /></w:rPr> <w:t>Дата-Время</w:t> ....... </w:tc> </w:tr> </w:tbl> </w:body> </w:wordDocument> Код, реализующий данный метод: public partial class _Default : System.Web.UI.Page { private string sSql = "моя строка для выборки данных"; private string connStr = "моя connectionstring" private StringBuilder stringbuilder = new StringBuilder(); private SqlDataReader datareader = null; ...... protected void Button2_Click(object sender, EventArgs e) { using (SqlConnection sqlConn = new SqlConnection(connStr)) { sqlConn.Open(); SqlCommand cmd = new SqlCommand(sSql, sqlConn); datareader = cmd.ExecuteReader(); stringbuilder.Append("<?mso-application progid=\"Word.Document\"?>"); stringbuilder.Append("<w:wordDocument xmlns:w=\"http://schemas" + ".microsoft.com/office/word/2003/wordml\">"); stringbuilder.Append("<w:body>"); stringbuilder.Append("<w:tbl>"); stringbuilder.Append("<w:tr>"); stringbuilder.Append("<w:tc><w:p><w:r><w:rPr>" + "<w:b w:val=\"on\" /></w:rPr><w:t>" + datareader.GetName(0).ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r>" + "<w:rPr><w:b w:val=\"on\" /></w:rPr><w:t>" + datareader.GetName(1).ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r>" + "<w:rPr><w:b w:val=\"on\" /></w:rPr><w:t>" + datareader.GetName(2).ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r>" + "<w:rPr><w:b w:val=\"on\" /></w:rPr><w:t>" + datareader.GetName(3).ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r>" + "<w:rPr><w:b w:val=\"on\" /></w:rPr><w:t>" + datareader.GetName(4).ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("</w:tr>"); while (datareader.Read()) { stringbuilder.Append("<w:tr>"); stringbuilder.Append("<w:tc><w:p><w:r><w:rPr>"); stringbuilder.Append("<w:b w:val=\"on\"/></w:rPr><w:t>"+ datareader["Город"].ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r><"+ "w:rPr><w:b w:val=\"off\"/></w:rPr><w:t>" + datareader["Дата-Время"].ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r><"+ "w:rPr><w:b w:val=\"off\"/></w:rPr><w:t>" + datareader["Температура"].ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r>"+ "<w:rPr><w:b w:val=\"off\"/></w:rPr><w:t>" + datareader["Облачность"].ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("<w:tc><w:p><w:r><w:rPr>"+ "<w:b w:val=\"off\"/></w:rPr><w:t>" + datareader["Осадки"].ToString() + "</w:t></w:r></w:p></w:tc>"); stringbuilder.Append("</w:tr>"); } stringbuilder.Append("</w:tbl></w:body></w:wordDocument>"); datareader.Close(); sqlConn.Close(); } StringWriter stringwriter = new StringWriter(); //StringBuilder понимает только Unicode, поэтому здесь encoding stringwriter.Write("<?xml version=\"1.0\" encoding = \"windows-1251\" ?>" + stringbuilder.ToString()); using (TextWriter textwriter = new StreamWriter(Server.MapPath("2.xml"), false, System.Text.Encoding.Default)) { textwriter.Write(stringwriter); } //Можно и так, но XML тогда в файле не отобразить нац кодировку (будет в unicode) //не поможет и вставка encoding = \"windows-1251\", хотя в Word отобразится нормально using (StreamWriter streamwriter = File.CreateText(Server.MapPath("3.xml"))) { streamwriter.Write("<?xml version=\"1.0\" ?>" + stringbuilder.ToString(), System.Text.Encoding.Unicode); } } } Результат показан на Рис.3.
Рис.3 XML файл, сформированный для отображения в Word Недостаток метода очевиден - найти ошибку в текстовой строке часто просто невозможно. Все закрывающие тэги элементов приходится отслеживать самостоятельно. Параграф 4. Формирование XML файла с использованием класса XmlTextWriterXmlTextWriter обеспечивает не буферизованное создание XML-документов и возможность их записи в файлы, потоки и пр. Класс XmlTextWriter предоставляет большое количество методов для создания XML-документов и записи практически всех тегов, текста, комментариев и даже массивов байт. Приведем сразу код, который результатом выполнения имеет файл XML, отображение которого в Word полностью аналогично, показанному на Рис.3. private string sSql = "моя строка для выборки данных"; private string connStr = "моя connectionstring" private XmlTextWriter writer; private SqlDataReader datareader = null; .... protected void Button3_Click(object sender, EventArgs e) { using(SqlConnection sqlconn = new SqlConnection(connStr)) { sqlconn.Open(); SqlCommand cmd = new SqlCommand(sSql, sqlconn); datareader = cmd.ExecuteReader(CommandBehavior.CloseConnection); writer = new XmlTextWriter(Server.MapPath("4.xml"), System.Text.Encoding.Default); writer.WriteStartDocument(false); writer.WriteProcessingInstruction("mso-application", "progid=\"Word.Document\""); writer.WriteStartElement("w:wordDocument"); writer.WriteAttributeString("xmlns:w", "http://schemas.microsoft.com/office/word/2003/wordml"); writer.WriteStartElement("w:body"); writer.WriteStartElement("w:tbl"); writer.WriteStartElement("w:tr"); getelements1(datareader.GetName(0).ToString(), true); getelements1(datareader.GetName(1).ToString(), true); getelements1(datareader.GetName(2).ToString(), true); getelements1(datareader.GetName(3).ToString(), true); getelements1(datareader.GetName(4).ToString(), true); writer.WriteEndElement(); while (datareader.Read()) { writer.WriteStartElement("w:tr"); getelements1(datareader[0].ToString(), true); getelements1(datareader[1].ToString(), false); getelements1(datareader[2].ToString(), false); getelements1(datareader[3].ToString(), false); getelements1(datareader[4].ToString(), false); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.Flush(); writer.Close(); sqlconn.Close(); } } //Функция введена для сокращения кода private void getelements1(string s, bool f) { writer.WriteStartElement("w:tc"); writer.WriteStartElement("w:p"); writer.WriteStartElement("w:r"); writer.WriteStartElement("w:rPr"); writer.WriteStartElement("w:b"); if(f) writer.WriteAttributeString("w:val", "on"); else writer.WriteAttributeString("w:val", "off"); writer.WriteEndElement(); writer.WriteStartElement("w:t"); writer.WriteString(s); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); } Этот способ, несомненно, проще предыдущего, за исключением того, что нам все же приходится отслеживать открывающие и закрывающие теги элементов. Этого недостатка лишен метод формирования XML файла с использованием класса XmlDocument. Параграф 5. Формирование XML файла с использованием класса XmlDocumentО классе XmlDocument мы уже говорили выше (см. "Доступ к содержимому XML файла в Visual Studio 2005"), поэтому здесь мы приводим только код, который позволяет сформировать XML документ, показанный на Рис.3. private string sSql = "моя строка для выборки данных"; private string connStr = "моя connectionstring" private XmlDocument xmldoc; private XmlElement xmlelementtr, xmlelement, xmlelement1, xmlelement2; private string WordNameSpace = @"http://schemas.microsoft.com/office/word/2003/wordml"; private SqlDataReader datareader = null; ...................... protected void Button4_Click(object sender, EventArgs e) { using (SqlConnection sqlconn = new SqlConnection(connStr)) { sqlconn.Open(); SqlCommand cmd = new SqlCommand(sSql, sqlconn); datareader = cmd.ExecuteReader(); xmldoc = new XmlDocument(); XmlDeclaration xmldeclaration = xmldoc.CreateXmlDeclaration("1.0", "windows-1251", "yes"); xmldoc.AppendChild(xmldeclaration); XmlProcessingInstruction xmlpi = xmldoc.CreateProcessingInstruction("mso-application", "progid=\"Word.Document\""); xmldoc.AppendChild(xmlpi); //Можно и так //xmldoc.InsertBefore(xmlpi, xmldoc.DocumentElement); XmlElement xmlelementdocument = xmldoc.CreateElement("w:wordDocument", WordNameSpace); xmldoc.InsertAfter(xmlelementdocument, xmlpi); XmlElement xmlelementbody = xmldoc.CreateElement("w:body", WordNameSpace); xmlelementdocument.AppendChild(xmlelementbody); XmlElement xmlelementtable = xmldoc.CreateElement("w:tbl", WordNameSpace); xmlelementbody.AppendChild(xmlelementtable); xmlelementtr = xmldoc.CreateElement("w:tr", WordNameSpace); xmlelementtable.AppendChild(xmlelementtr); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader.GetName(0).ToString())); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader.GetName(1).ToString())); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader.GetName(2).ToString())); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader.GetName(3).ToString())); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader.GetName(4).ToString())); while (datareader.Read()) { //Всегда нодо создавать новый элемент xmlelementtr - без этой строки все //элементы будут в одной строке xmlelementtr = xmldoc.CreateElement("w:tr", WordNameSpace); xmlelementtable.AppendChild(xmlelementtr); getelements(true); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader[0].ToString())); getelements(false); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader[1].ToString())); getelements(false); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader[2].ToString())); getelements(false); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader[3].ToString())); getelements(false); xmlelement2.AppendChild(xmlelement).AppendChild (xmldoc.CreateTextNode(datareader[4].ToString())); } sqlconn.Close(); } xmldoc.Save(Server.MapPath("5.xml")); } Из приведенных выше примеров, можно сделать вывод, что использование класса XmlDocument наиболее подходит для создания XML файлов для последующего их отображения в Word и Excel. Параграф 6. Формирование XML файла для отображения в ExcelВ силу указанных выше причин, для формирования XML файла для отображения в Excel будем использовать класс XmlDocument. Поставим целью создание XML файла для отображения таблички, данные в которую бедем брать из таблиц БД (Рис.4):
Рис.4 Целевой вывод для отображения в Excel Как обычно, рекомендуется, создать в Excel табличку (хотя бы два столбца и две строки с отображением желаемого форматирования) и, затем, сохранить ее как xml таблицу. Далее, убрать все лишнее и повторить то, что останется методами XmlDocument. Код, реализующий таблицу Рис.4, показан ниже. Он не так велик, как уажется на первый взгляд, 90% его - это определение стилей. ...... using System.Data.SqlClient; using System.IO; using System.Xml; ...... public partial class _Default : System.Web.UI.Page { ........ private SqlDataReader dr = null; private XmlDocument xmldoc; private string sSql = "Ваш SQL"; private string = "Ваш СonnectionString"; //Для удобства включения в методы определим OfficeNameSpace private string OfficeNameSpace = "urn:schemas-microsoft-com:office:spreadsheet"; //Для удобства включения в методы определим ExcelNameSpace private string ExcelNameSpace = "urn:schemas-microsoft-com:office:excel"; //Така как используем функции, то проще основные XmlElement //определить глобально private XmlElement xmlelementworkbook, xmlelementstyles, xmlelementstyle,xmlelementsheet,xmlelementtable, xmlelementcolumn, xmlelementrow, xmlelementcell, xmlelementdata, xmlelement, xmlelement1; private XmlAttribute xmlattribut=null; ...... protected void Button5_Click(object sender, EventArgs e) { using(SqlConnection sqlconn = new SqlConnection(connStr)) { sqlconn.Open(); SqlCommand cmd = new SqlCommand(sSql, sqlconn); dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // XmlDocument xmldoc = new XmlDocument(); XmlDeclaration xmldeclaration = xmldoc.CreateXmlDeclaration("1.0", "windows-1251", "yes"); xmldoc.InsertBefore(xmldeclaration, xmldoc.DocumentElement); XmlProcessingInstruction xmlprocinstr = xmldoc.CreateProcessingInstruction("mso-application", "progid=\"Excel.Sheet\""); xmldoc.InsertBefore(xmlprocinstr, xmldoc.DocumentElement); // Создаем книгу xmlelementworkbook = xmldoc.CreateElement("Workbook"); xmlelementworkbook.SetAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet"); xmlelementworkbook.SetAttribute("xmlns:o", "urn:schemas-microsoft-com:office:office"); xmlelementworkbook.SetAttribute("xmlns:x", "urn:schemas-microsoft-com:office:excel"); xmlelementworkbook.SetAttribute("xmlns:ss", "urn:schemas-microsoft-com:office:spreadsheet"); xmlelementworkbook.SetAttribute("xmlns:html", "http://www.w3.org/TR/REC-html40"); xmldoc.AppendChild(xmlelementworkbook); //Можно так //xmldoc.InsertAfter(xmlelementworkbook,xmlprocinstr); // Задаем свойства Workbook XmlElement xmlelemendocprop = xmldoc.CreateElement("DocumentProperties"); xmlelemendocprop.SetAttribute("xmlns", "urn:schemas-microsoft-com:office:office"); xmlelementworkbook.AppendChild(xmlelemendocprop); xmlelement = xmldoc.CreateElement("LastAuthor"); xmlelement.InnerText = "Wlad"; xmlelemendocprop.AppendChild(xmlelement); //Можно установить, но управлять параметрами книги //при отображении всеравно не сможем //xmlelement= xmldoc.CreateElement("ExcelWorkbook"); //xmlelement.SetAttribute("xmlns", "urn:schemas-microsoft-com:office:excel"); //xmlelementworkbook.AppendChild(xmlelement); //xmlelement1= xmldoc.CreateElement("WindowHeight"); //xmlelement1.InnerText = "500"; //xmlelement.AppendChild(xmlelement1); // Добавляем стили vMakeStyle(); // Создаем лист и даем ему имя xmlelementsheet = xmldoc.CreateElement("Worksheet"); xmlattribut = xmldoc.CreateAttribute("ss", "Name", OfficeNameSpace); xmlattribut.Value = "Первый лист"; xmlelementsheet.Attributes.Append(xmlattribut); xmlelementworkbook.AppendChild(xmlelementsheet); //Создаем Excel Таблицу xmlelementtable = xmldoc.CreateElement("Table"); //Можно, но не обязательно определить размер таблицы //xmlattribut = xmldoc.CreateAttribute("ss", // "ExpandedColumnCount", OfficeNameSpace); //xmlattribut.Value = "8"; xmlelementsheet.AppendChild(xmlelementtable); //Определяем стили и размеры столбцов vMakeColumnStyle(); //Пустая строка xmlelementrow = xmldoc.CreateElement("Row"); xmlelementtable.AppendChild(xmlelementrow); xmlelementrow = xmldoc.CreateElement("Row"); xmlelementtable.AppendChild(xmlelementrow); //Для вывода данных в ячейуку используем функцию //с передачей ей стиля отображения данных и ячейки //Пустой столбец settextexcel("", ""); //Данные и стиль ячейки settextexcel(dr.GetName(0).ToString(), "s5"); settextexcel(dr.GetName(1).ToString(), "s3"); settextexcel(dr.GetName(2).ToString(), "s3"); settextexcel(dr.GetName(3).ToString(), "s3"); settextexcel(dr.GetName(4).ToString(), "s4"); while (dr.Read()) { xmlelementrow = xmldoc.CreateElement("Row"); xmlelementtable.AppendChild(xmlelementrow); //Пустой столбец settextexcel("", ""); settextexcel(dr[0].ToString(), "s6"); settextexcel(dr[1].ToString(), "s6"); settextexcel(dr[2].ToString(), "s2"); settextexcel(dr[3].ToString(), "s6"); settextexcel(dr[3].ToString(), "s6"); } } xmldoc.Save(Server.MapPath("ex1.xml")); } //Вывод текста private void settextexcel(string s, string s1) { xmlelementcell = xmldoc.CreateElement("Cell"); if(s1 != "") { xmlattribut = xmldoc.CreateAttribute("ss", "StyleID", OfficeNameSpace); xmlattribut.Value = s1; xmlelementcell.Attributes.Append(xmlattribut); } xmlelementrow.AppendChild(xmlelementcell); xmlelementdata = xmldoc.CreateElement("Data"); xmlattribut = xmldoc.CreateAttribute("ss", "Type", OfficeNameSpace); xmlattribut.Value = "String"; xmlelementdata.Attributes.Append(xmlattribut); xmlelementdata.InnerText = s; xmlelementcell.AppendChild(xmlelementdata); } //Создание стилей private void vMakeColumnStyle() { //Первый столбец пропущенный xmlelementcolumn = xmldoc.CreateElement("Column"); xmlelementtable.AppendChild(xmlelementcolumn); //Второй xmlelementcolumn = xmldoc.CreateElement("Column", OfficeNameSpace); xmlattribut = xmldoc.CreateAttribute("ss", "Index", OfficeNameSpace); xmlattribut.Value = "2"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "AutoFitWidth", OfficeNameSpace); xmlattribut.Value = "0"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Width", OfficeNameSpace); xmlattribut.Value = "80"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlelementtable.AppendChild(xmlelementcolumn); //третий столбец xmlelementcolumn = xmldoc.CreateElement("Column", OfficeNameSpace); xmlattribut = xmldoc.CreateAttribute("ss", "Index", OfficeNameSpace); xmlattribut.Value = "3"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "AutoFitWidth", OfficeNameSpace); xmlattribut.Value = "0"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Width", OfficeNameSpace); xmlattribut.Value = "100"; //Можно стиль задать для всего столбца сразу - линовка будет вне таблицы //xmlelementcolumn.Attributes.Append(xmlattribut); //xmlattribut = xmldoc.CreateAttribute("ss", "StyleID", OfficeNameSpace); //xmlattribut.Value = "s2"; //xmlelementcolumn.Attributes.Append(xmlattribut); xmlelementtable.AppendChild(xmlelementcolumn); //Четвертый столбец xmlelementcolumn = xmldoc.CreateElement("Column", OfficeNameSpace); xmlattribut = xmldoc.CreateAttribute("ss", "Index", OfficeNameSpace); xmlattribut.Value = "4"; xmlattribut = xmldoc.CreateAttribute("ss", "AutoFitWidth", OfficeNameSpace); xmlattribut.Value = "0"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Width", OfficeNameSpace); xmlattribut.Value = "100"; xmlelementtable.AppendChild(xmlelementcolumn); //Пятый столбец xmlelementcolumn = xmldoc.CreateElement("Column", OfficeNameSpace); xmlattribut = xmldoc.CreateAttribute("ss", "Index", OfficeNameSpace); xmlattribut.Value = "5"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "AutoFitWidth", OfficeNameSpace); xmlattribut.Value = "0"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Width", OfficeNameSpace); xmlattribut.Value = "200"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlelementtable.AppendChild(xmlelementcolumn); //шестой столбец xmlelementcolumn = xmldoc.CreateElement("Column"); xmlelementcolumn = xmldoc.CreateElement("Column", OfficeNameSpace); xmlattribut = xmldoc.CreateAttribute("ss", "Index", OfficeNameSpace); xmlattribut.Value = "6"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "AutoFitWidth", OfficeNameSpace); xmlattribut.Value = "0"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Width", OfficeNameSpace); xmlattribut.Value = "200"; xmlelementcolumn.Attributes.Append(xmlattribut); xmlelementtable.AppendChild(xmlelementcolumn); } private void vMakeStyle() { //Набор стилей xmlelementstyles = xmldoc.CreateElement("Styles"); xmlelementworkbook.AppendChild(xmlelementstyles); //Стиль по умолчанию xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "Default"; xmlelementstyle.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Name", OfficeNameSpace); xmlattribut.Value = "Normal"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Alignment"); xmlattribut = xmldoc.CreateAttribute("ss", "Horizontal", OfficeNameSpace); xmlattribut.Value = "Left"; xmlelement.Attributes.Append(xmlattribut); xmlelementstyle.AppendChild(xmlelement); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement = xmldoc.CreateElement("Font"); xmlattribut = xmldoc.CreateAttribute("ss", "FontName", OfficeNameSpace); xmlattribut.Value = "Arial Cyr"; xmlelement.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("x", "CharSet", ExcelNameSpace); xmlattribut.Value = "204"; xmlelement.Attributes.Append(xmlattribut); xmlelementstyle.AppendChild(xmlelement); //В стили можно добавить другие значения элементов (здесь они пустые) xmlelement = xmldoc.CreateElement("Interior"); xmlelementstyle.AppendChild(xmlelement); xmlelement = xmldoc.CreateElement("NumberFormat"); xmlelementstyle.AppendChild(xmlelement); xmlelement = xmldoc.CreateElement("Protection"); xmlelementstyle.AppendChild(xmlelement); //Стиль s2 c сеткой толщиной 1 и выравниванием по центру xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "s2"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Bottom"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Right"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Top"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Left"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Alignment"); xmlattribut = xmldoc.CreateAttribute("ss", "Horizontal", OfficeNameSpace); xmlattribut.Value = "Center"; xmlelement.Attributes.Append(xmlattribut); xmlelementstyle.AppendChild(xmlelement); xmlelement = xmldoc.CreateElement("Font"); xmlattribut = xmldoc.CreateAttribute("ss", "FontName", OfficeNameSpace); xmlattribut.Value = "Arial Cyr"; xmlelement.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("x", "CharSet", ExcelNameSpace); xmlattribut.Value = "204"; xmlelement.Attributes.Append(xmlattribut); xmlelementstyle.AppendChild(xmlelement); //Стиль Обводка жирным верх и низ левая и правая тонким xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "s3"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); //Низ xmlattribut.Value = "Bottom"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); //Верх xmlattribut.Value = "Top"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); //левая xmlattribut.Value = "Left"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); //правая xmlattribut.Value = "Right"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); //Стиль Обводка жирным низ, верх и правая - левая тонким xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "s4"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Bottom"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Top"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Right"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Left"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); //Стиль Обводка жирным низ, верх и левая xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "s5"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Bottom"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Top"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Left"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "2"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Right"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); //Стиль Обводка тонким xmlelementstyle = xmldoc.CreateElement("Style"); xmlattribut = xmldoc.CreateAttribute("ss", "ID", OfficeNameSpace); xmlattribut.Value = "s6"; xmlelementstyle.Attributes.Append(xmlattribut); xmlelementstyles.AppendChild(xmlelementstyle); xmlelement = xmldoc.CreateElement("Borders"); xmlelementstyle.AppendChild(xmlelement); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Bottom"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Right"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Top"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); xmlelement1 = xmldoc.CreateElement("Border"); xmlattribut = xmldoc.CreateAttribute("ss", "Position", OfficeNameSpace); xmlattribut.Value = "Left"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "LineStyle", OfficeNameSpace); xmlattribut.Value = "Continuous"; xmlelement1.Attributes.Append(xmlattribut); xmlattribut = xmldoc.CreateAttribute("ss", "Weight", OfficeNameSpace); xmlattribut.Value = "1"; xmlelement1.Attributes.Append(xmlattribut); xmlelement.AppendChild(xmlelement1); } Литература:Молчанов Владислав 25.07.2006г. Еcли Вы пришли с поискового сервера - посетите мою главную страничкуНа главной странице Вы найдете программы комплекса Veles - программы для автолюбителей,
программу NumberPhoto, созданную для работы с фото, сделанными цифровым фотоаппаратом,
программу Локальный Web сайт - предназначенную для просмотра и прослушивания
файлов большинства графических и звуковых форматов в Web Browser,
программу Bricks - игрушку для детей и взрослых, программу записную книжку,
программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается
погостить за бугром или повысить свои знания в английском, теоретический материал
по программированию в среде Borland C++ builder, C# (Windows приложения и ASP.Net Web сайты).
|