Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/41: Рейтинг темы: голосов - 41, средняя оценка - 4.66
0 / 0 / 1
Регистрация: 27.04.2010
Сообщений: 24
1

Создание документов .doc и .xls

14.07.2010, 11:23. Просмотров 8311. Ответов 6
Метки нет (Все метки)

Здравствуйте все!
Задача: написать генератор отчетов, который бы создавал документы формата .doc и .xls. Но при этом на целевых компах нет (и не будет) MS Office, люди работают в OpenOffice, а документацию передают заказчику в .doc и .xls форматах. Насколько я понимаю, использовать COM объекты MS Office не получится. Я уверен, что решение есть, но по неопытности не знаю где оно. Собственно вопрос заключается в том, каким образом в при таких обстоятельствах создавать документы необходимых форматов и програмно их заполнять.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2010, 11:23
Ответы с готовыми решениями:

Конвертация MS Office документов (doc, xls) в графические файлы
Всем привет! Может кто сталкивался, можно ли сделать конвертацию MS Office документов (doc,...

Работа с файлами в формате .doc, .docx, .xls, .xlsx
Добрый день! Подскажите, есть ли какая-то альтернатива COM-объектам для извлечения текста из...

Посоветуйте библиотеку для формирования отчетов в *.pdf, *.doc, *.xls
Доброго времени суток, уважаемые форумчане! В очередной раз поднимаю вопрос об отчетах в C#.NET....

Парсинг DOC документов и генерация новых (по категориям)
Здравствуйте уважаемые форумчане! Я учитель в школе и занимаюсь подготовкой к ЕГЭ. У меня давно...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
6
405 / 357 / 82
Регистрация: 07.10.2009
Сообщений: 558
14.07.2010, 12:31 2
Цитата Сообщение от Oooleg_ Посмотреть сообщение
Но при этом на целевых компах нет (и не будет) MS Office, люди работают в OpenOffice
В этом случае проще копать в сторону создания файлов odt и ods, на ИнфраРесурс есть материалы на эту тему, у меня что-то было, но до компьютера где это лежит доберусь не раньше следующей недели.
0
22 / 22 / 3
Регистрация: 08.07.2010
Сообщений: 25
14.07.2010, 12:49 3
Для начала, что бы было от чего оттолкнуться )
http://www.opendocument4all.co... ce.net.pdf
0
0 / 0 / 1
Регистрация: 27.04.2010
Сообщений: 24
14.07.2010, 13:04  [ТС] 4
Спасибо за советы! Как альтернативный вариант конечно можно попробовать выдавать отчеты в OOo фомате, но потом их все равно придется пересохранять в .doc и .xls, поэтому всетаки более предпочтительным остается изначальное создание форматов MS Office.
Неужели это такая сложная задача?...

Надеюсь всетаки получить советы по решению поставленной задачи, а не компромисные варианты...
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
14.07.2010, 13:39 5
Вообще-то у OpenOffice очень развитый API. Например из Python ты можешь делать практически все что угодно. Копай в ту сторону. Поищи людей, которые активно работают с OpenOffice. Решение твоей проблемы точно существует. Успехов.
0
22 / 22 / 3
Регистрация: 08.07.2010
Сообщений: 25
14.07.2010, 13:50 6
Reading and Writing Excel using OLEDB
http://www.codeproject.com/KB/... oledb.aspx
http://www.davidhayden.com/blo... /2973.aspx
http://support.microsoft.com/kb/316934/ru

цитата из social.msdn.microsoft.com

"It's not possible to read Excel files via Excel interop unless Excel is installed on the machine; this is because when you use Excel interop, you're actually controlling the Excel program, so of course it needs to be there.

An alternative method exists for reading Excel files: using ADO.NET. I have some example code here: http://code.msdn.microsoft.com/NitoExcel. Note that this interprets the Excel worksheets as "tables", and does not support all the functionality of the interop interface. Futhermore, it can only be used from 32-bit code, not 64-bit.

However, the ADO.NET method can be used on computers where Excel isn't installed. So it's something to consider."

P.S. сам не пробовал
0
4 / 4 / 1
Регистрация: 08.07.2010
Сообщений: 29
15.07.2010, 00:52 7
Пример как создавать XLSX файл и выводить в нем данные в виде диаграмм на C# NET 3.5 только нужно установить дополнительные библиотеки Open XML SDK

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Linq;
using System.Linq;
using DocumentFormat.OpenXml.Vml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using System.Xml;
using Microsoft.Office.Tools.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using DocumentFormat.OpenXml.Drawing;
 
namespace prpject0 {
    public class Lol {
        //Генерация файла base.xlsx
        public static void CreateSpreadsheetWorkbook(string filepath) {
            SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
 
            WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
            workbookpart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
 
            WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
            worksheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(new SheetData());
 
            Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
 
            Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 2, Name = "mySheet" };
 
            sheets.Append(sheet);
 
            workbookpart.Workbook.Save();
 
            spreadsheetDocument.Close();
        }
    }
    public class graphic {
        public static void InsertChartInSpreadsheet(string docName, string worksheetName, string title, Dictionary<string, int> data) {
            using (SpreadsheetDocument document = SpreadsheetDocument.Open(docName, true)) {
                IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == worksheetName);
                if (sheets.Count() == 0) {
                    return;
                }
                WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
 
                DrawingsPart drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
                worksheetPart.Worksheet.Append(new DocumentFormat.OpenXml.Spreadsheet.Drawing() { Id = worksheetPart.GetIdOfPart(drawingsPart) });
                worksheetPart.Worksheet.Save();
 
                ChartPart chartPart = drawingsPart.AddNewPart<ChartPart>();
                chartPart.ChartSpace = new ChartSpace();
                chartPart.ChartSpace.Append(new EditingLanguage() { Val = new StringValue("en-US") });
                DocumentFormat.OpenXml.Drawing.Charts.Chart chart = chartPart.ChartSpace.AppendChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>(
                new DocumentFormat.OpenXml.Drawing.Charts.Chart());
 
                PlotArea plotArea = chart.AppendChild<PlotArea>(new PlotArea());
                Layout layout = plotArea.AppendChild<Layout>(new Layout());
                BarChart barChart = plotArea.AppendChild<BarChart>(new BarChart(new BarDirection() { Val = new EnumValue<BarDirectionValues>(BarDirectionValues.Column) },
                new BarGrouping() { Val = new EnumValue<BarGroupingValues>(BarGroupingValues.Clustered) }));
 
                uint i = 0;
 
                foreach (string key in data.Keys) {
                    BarChartSeries barChartSeries = barChart.AppendChild<BarChartSeries>(new BarChartSeries(new Index() { Val = new UInt32Value(i) },
                    new Order() { Val = new UInt32Value(i) },
                    new SeriesText(new NumericValue() { Text = key })));
 
                    StringLiteral strLit = barChartSeries.AppendChild<CategoryAxisData>(new CategoryAxisData()).AppendChild<StringLiteral>(new StringLiteral());
                    strLit.Append(new PointCount() { Val = new UInt32Value(1U) });
                    strLit.AppendChild<StringPoint>(new StringPoint() { Index = new UInt32Value(0U) }).Append(new NumericValue(title));
 
                    NumberLiteral numLit = barChartSeries.AppendChild<DocumentFormat.OpenXml.Drawing.Charts.Values>(
                    new DocumentFormat.OpenXml.Drawing.Charts.Values()).AppendChild<NumberLiteral>(new NumberLiteral());
                    numLit.Append(new FormatCode("General"));
                    numLit.Append(new PointCount() { Val = new UInt32Value(1U) });
                    numLit.AppendChild<NumericPoint>(new NumericPoint() { Index = new UInt32Value(0u) }).Append(new NumericValue(data[key].ToString()));
 
                    i++;
                }
 
                barChart.Append(new AxisId() { Val = new UInt32Value(48650112u) });
                barChart.Append(new AxisId() { Val = new UInt32Value(48672768u) });
 
                CategoryAxis catAx = plotArea.AppendChild<CategoryAxis>(new CategoryAxis(new AxisId() { Val = new UInt32Value(48650112u) },
                new Scaling(new Orientation() {
                    Val = new EnumValue<DocumentFormat.OpenXml.Drawing.Charts.OrientationValues>(
                    DocumentFormat.OpenXml.Drawing.Charts.OrientationValues.MinMax)
                }),
                new AxisPosition() { Val = new EnumValue<AxisPositionValues>(AxisPositionValues.Bottom) },
                new TickLabelPosition() { Val = new EnumValue<TickLabelPositionValues>(TickLabelPositionValues.NextTo) },
                new CrossingAxis() { Val = new UInt32Value(48672768U) },
                new Crosses() { Val = new EnumValue<CrossesValues>(CrossesValues.AutoZero) },
                new AutoLabeled() { Val = new BooleanValue(true) },
                new LabelAlignment() { Val = new EnumValue<LabelAlignmentValues>(LabelAlignmentValues.Center) },
                new LabelOffset() { Val = new UInt16Value((ushort)100) }));
 
                ValueAxis valAx = plotArea.AppendChild<ValueAxis>(new ValueAxis(new AxisId() { Val = new UInt32Value(48672768u) },
                new Scaling(new Orientation() {
                    Val = new EnumValue<DocumentFormat.OpenXml.Drawing.Charts.OrientationValues>(
                    DocumentFormat.OpenXml.Drawing.Charts.OrientationValues.MinMax)
                }),
                new AxisPosition() { Val = new EnumValue<AxisPositionValues>(AxisPositionValues.Left) },
                new MajorGridlines(),
                new DocumentFormat.OpenXml.Drawing.Charts.NumberingFormat() { FormatCode = new StringValue("General"), SourceLinked = new BooleanValue(true) },
                new TickLabelPosition() { Val = new EnumValue<TickLabelPositionValues>(TickLabelPositionValues.NextTo) },
                new CrossingAxis() { Val = new UInt32Value(48650112U) },
                new Crosses() { Val = new EnumValue<CrossesValues>(CrossesValues.AutoZero) },
                new CrossBetween() { Val = new EnumValue<CrossBetweenValues>(CrossBetweenValues.Between) }));
 
                Legend legend = chart.AppendChild<Legend>(new Legend(new LegendPosition() { Val = new EnumValue<LegendPositionValues>(LegendPositionValues.Right) },
                new Layout()));
 
                chart.Append(new PlotVisibleOnly() { Val = new BooleanValue(true) });
 
                chartPart.ChartSpace.Save();
 
                drawingsPart.WorksheetDrawing = new WorksheetDrawing();
                TwoCellAnchor twoCellAnchor = drawingsPart.WorksheetDrawing.AppendChild<TwoCellAnchor>(new TwoCellAnchor());
                twoCellAnchor.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker(new ColumnId("9"),
                new ColumnOffset("581025"),
                new RowId("17"),
                new RowOffset("114300")));
                twoCellAnchor.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker(new ColumnId("17"),
                new ColumnOffset("276225"),
                new RowId("32"),
                new RowOffset("0")));
 
                DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame graphicFrame =
                twoCellAnchor.AppendChild<DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame>(
                new DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame());
                graphicFrame.Macro = "";
 
                graphicFrame.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualGraphicFrameProperties(
                new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties() { Id = new UInt32Value(2u), Name = "Chart 1" },
                new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualGraphicFrameDrawingProperties()));
 
                graphicFrame.Append(new Transform(new Offset() { X = 0L, Y = 0L },
                new Extents() { Cx = 0L, Cy = 0L }));
 
                graphicFrame.Append(new Graphic(new GraphicData(new ChartReference() { Id = drawingsPart.GetIdOfPart(chartPart) }) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" }));
 
                twoCellAnchor.Append(new ClientData());
 
                drawingsPart.WorksheetDrawing.Save();
            }
        }
    }
    class Program {
        static void Main(string[] args) {
            Lol.CreateSpreadsheetWorkbook("c:\\base.xlsx");
 
 
            string[] Line = File.ReadAllLines("c:\\log.txt", Encoding.Default);
 
            Dictionary<string, int> ips = new Dictionary<string, int>();
            foreach (string line in Line) {
                if (line.StartsWith("#")) continue;
                string key = line.Split(' ')[8];
                if (ips.ContainsKey(key))
                    ips[key]++;
                else
                    ips[key] = 1;
            }
            var dict = new Dictionary<string, int>();
            foreach (KeyValuePair<string, int> ip in ips) {
                dict.Add(ip.Key, ip.Value);
            }
            graphic.InsertChartInSpreadsheet("c:\\base.xlsx", "mySheet", "title ", dict);
 
        }
    }
}
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2010, 00:52

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Создание отчета .doc / .docx на основе шаблона
Есть шаблон .dot / .dotx, в нем поля с именами. Необходимо из C# создавать файл на основе шаблона,...

Создание списка недавно открытых документов собственного приложения
Всем привет! Возник еще один вопрос. Как реализовать список недавно открытых документов своего...

Просмотр *.xls и *.doc с помощью IE ???
Cобссно сабж(хотя бы с минимальными функциями), при условии что эти самые Ворд и Ексель на машине...

Бесплатные либы для создания, редактирования PDF, DOCX, XLSX, XLS, DOC и конвертации их между собой
Существует ли бесплатная библиотека, которая позволяет делать все и сразу - создавать,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.