Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# Очереди и память https://www.cyberforum.ru/ csharp-beginners/ thread1991630.html
Доброго времени суток имеется задание Индивидуальное задание: Создать windows приложение для вывода информации о виртуальной памяти (Размер структуры, процент занятой памяти, общее кол-во...
Ошибка при преобразование типа строки из консоли в double C#
Есть переменная типа double, ввожу её значение с консоли, сразу же выбивает ошибку. Как правильно вводить/преобразовать? double a; a = double.Parse(Console.ReadLine());
C# Дана строка, заменить 'a' на 'b', а 'b' на 'a'
Здравствуйте, помогите, пожалуйста, найти ошибки. Задание:Дана строка, заменить 'a' на 'b', а 'b' на 'a'. using System; namespace Prog1 { class Program { static void Main()...
C# Дана строка, удвоить каждый символ Здравствуйте, помогите пожалуйста найти ошибки. Задание :Дана строка, удвоить каждый символ using System; namespace Prog1 { class Program { static void Main() { https://www.cyberforum.ru/ csharp-beginners/ thread1991581.html
C# Преобразование List<Child> to List<Parent> и обратно https://www.cyberforum.ru/ csharp-beginners/ thread1991580.html
Здравствуйте, подскажите пожалуйста, как правильно реализовать преобразование списка объектов класса наследника в список объектов родителя и обратно, и будут ли при этом утеряны данные(возможно очень...
C# Перевод из с++(Поиск седловой точки)
Здравствуйте я написал код на с++(мейби год назад еще) но мне нужно его перевести в си шарп, не могли бы помочь ибо в нём совсем не разбираюсь и выучить за 1-2 дня вряд ли смогу. Вот код #include...
Убрать свой процесс из списка полученных процессов C#
var pro = Process.GetProcesses(); foreach (var pcc in pro) { var wt = pcc.MainWindowTitle; if (pcc.MainWindowTitle == string.Empty) { wt = "- N/A"; } ...
C# Ошибка в алгоритме метода ветвей и границ - на некоторых графах программа зависает Добрый день! Ошибка в алгоритме, метод ветвей и границ - поиск минимального пути в графе. На некоторых графах работает, на некоторых нет - программа зависает рабочий вариант: 0 1 9 9 0 1 0 6 10... https://www.cyberforum.ru/ csharp-beginners/ thread1991506.html
C# Работа двумерного массива https://www.cyberforum.ru/ csharp-beginners/ thread1991488.html
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args)
C# Есть ли в матрице Y (K,N) столбец, в котором все элементы равны между собой Всем привет! Может кто-нибудь помочь (написать) с этой задачей на c# ? Есть ли в матрице Y (K,N) столбец, в котором все элементы равны между собой? https://www.cyberforum.ru/ csharp-beginners/ thread1991443.html
8177 / 4434 / 1737
Регистрация: 11.02.2013
Сообщений: 9,423
29.05.2017, 05:24 0

Создание таблиц в MS Word

29.05.2017, 05:24. Показов 7341. Ответов 7
Метки (Все метки)

Ответ

я бы делал это в таблицах Excel. Но можно и в Word.
Шаблон примерно такой:
gridTemplate.zip
В таблице два вида записей: те, что выделены жирным шрифтом и обычные. В модели данных я назвал первые Category, а вторые Discipline. Общие свойства я объединил в абстрактный класс AcademicLoad. Также для описания обязательной нагрузки сделан класс StatutoryLoad
Модель данных

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Category : AcademicLoad
{
    public Category(string index)
        : base(index) { }
 
    public Category()
        : base()
    {
 
    }
    /// <summary>
    /// Дисциплины в данной категории
    /// </summary>
    public List<Discipline> Disciplines { get; } = new List<Discipline>();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Discipline : AcademicLoad
{
    /// <summary>
    /// Формы промежуточной аттестации
    /// </summary>
    public string[] MidtermAssessment { get; } = new string[8];
    /// <summary>
    /// Распределение обязательной нагрузки
    /// </summary>
    public int[] WorkloadDistribution { get; } = new int[8];
 
    public Discipline(string index)
        : base(index) { }
 
    public Discipline()
        : base()
    {
            
    }
}
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
public abstract class AcademicLoad
{
    protected AcademicLoad(string index)
    {
        Index = index;
    }
 
    protected AcademicLoad()
    {
 
    }
    /// <summary>
    /// Название категории или дисциплины
    /// </summary>
    public string Title { get; set; }
    /// <summary>
    /// Индекс
    /// </summary>
    public string Index { get; set; }
    /// <summary>
    /// Максимальная нагрузка
    /// </summary>
    public int MaxLoad { get; set; }
    /// <summary>
    /// Самостоятельная работа
    /// </summary>
    public int SelfGuided { get; set; }
    /// <summary>
    /// Обязательная нагрузка
    /// </summary>
    public StatutoryLoad StatutoryLoad { get; set; } = new StatutoryLoad();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Обязательная нагрузка
/// </summary>
public class StatutoryLoad
{
    /// <summary>
    /// Всего
    /// </summary>
    public int Total { get; set; }
    /// <summary>
    /// ЛИЗ без деления
    /// </summary>
    public int LIZWithoutDivision { get; set; }
    /// <summary>
    /// ЛИЗ с делением
    /// </summary>
    public int LIZWithDivision { get; set; }
    /// <summary>
    /// Курсовой проект (работа)
    /// </summary>
    public int TermProject { get; set; }
}

Остаётся разработать методы для добавления в таблицу категории и дисциплины. Этим и всей остальной работой по отчёту занимается класс Report:
Класс Report
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
public class Report : IDisposable
{
    private const float CENTIMETRES_TO_POINTS = 28.34646f;
    private dynamic _wdDoc;
    private dynamic _wdApp;
    /// <summary>
    /// Создание нового экземпляра отчёта на основе шаблона.
    /// </summary>
    /// <param name="template">Путь к шаблону.</param>
    /// <param name="visible">Показывать ли окно приложения во время работы.</param>
    public Report(string template, bool visible = false)
    {
        NewDoc(template, visible);
    }
 
    private void NewDoc(string template, bool visible)
    {
        OpenApp(visible);
        CreateDoc(template);
    }
 
    private void OpenApp(bool visible)
    {
        var type = Type.GetTypeFromProgID("Word.Application", false);
        if (type == null)
        {
            throw new InvalidOperationException("Не удалось запустить приложение Word. Возожно оно не установлено.");
        }
        _wdApp = Activator.CreateInstance(type);
        _wdApp.Visible = visible;
    }
 
    private void CreateDoc(string template)
    {
        _wdDoc = _wdApp.Documents.Add(Template: template);
    }
    /// <summary>
    /// Добавление категории в документ.
    /// </summary>
    public void AddCategory(Category category)
    {
        var table = AddRow();
 
        var row = (int)table.Rows.Count;
        table.Cell(row, 1).Range.Font.Bold = 1;
        table.Cell(row, 2).Range.Font.Bold = 1;
 
        table.Cell(row, 1).Range.Text = category.Index;
        table.Cell(row, 2).Range.Text = category.Title;
            
        table.Cell(row, 11).Range.Text = category.MaxLoad.GetString();
        table.Cell(row, 12).Range.Text = category.SelfGuided.GetString();
        table.Cell(row, 13).Range.Text = category.StatutoryLoad.Total.GetString();
 
        table.Cell(row, 14).Range.Text = category.StatutoryLoad.LIZWithoutDivision.GetString();
        table.Cell(row, 14).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 15).Range.Text = category.StatutoryLoad.LIZWithDivision.GetString();
        table.Cell(row, 15).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 16).Range.Text = category.StatutoryLoad.TermProject.GetString();
        table.Cell(row, 16).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        AutoSizeRow(table, row);
    }
    /// <summary>
    /// Сохранение документа.
    /// </summary>
    /// <param name="fileName">Полный путь к файлу.</param>
    public void Save(string fileName)
    {
        float appVersion = float.Parse(_wdApp.Version.ToString(), CultureInfo.InvariantCulture);
        if (appVersion < 14)
        {
            _wdDoc.SaveAs(fileName);
        }
        else
        {
            _wdDoc.SaveAs2(fileName);
        }
    }
    /// <summary>
    /// Добавление дисциплины в список.
    /// </summary>
    public void AddDiscipline(Discipline discipline)
    {
        var table = AddRow();
        var row = (int)table.Rows.Count;
        table.Cell(row, 1).Range.Font.Bold = 0;
        table.Cell(row, 2).Range.Font.Bold = 0;
 
        table.Cell(row, 1).Range.Text = discipline.Index;
        table.Cell(row, 2).Range.Text = discipline.Title;
 
        for (var i = 0; i < discipline.MidtermAssessment.Length; i++)
        {
            table.Cell(row, i + 3).Range.Text = discipline.MidtermAssessment[i];
        }
 
        table.Cell(row, 11).Range.Text = discipline.MaxLoad.GetString();
        table.Cell(row, 12).Range.Text = discipline.SelfGuided.GetString();
        table.Cell(row, 13).Range.Text = discipline.StatutoryLoad?.Total.GetString();
 
        table.Cell(row, 14).Range.Text = discipline.StatutoryLoad?.LIZWithoutDivision.GetString();
        table.Cell(row, 14).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 15).Range.Text = discipline.StatutoryLoad?.LIZWithDivision.GetString();
        table.Cell(row, 15).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 16).Range.Text = discipline.StatutoryLoad?.TermProject.GetString();
        table.Cell(row, 16).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        for (var i = 0; i < discipline.WorkloadDistribution.Length; i++)
        {
            table.Cell(row, i + 17).Range.Text = discipline.WorkloadDistribution[i].GetString();
        }
 
        AutoSizeRow(table, row);
    }
    /// <summary>
    /// Добавление нескольких диспциплин.
    /// </summary>
    public void AddDisciplines(IEnumerable<Discipline> disciplines)
    {
        foreach (var discipline in disciplines)
        {
            AddDiscipline(discipline);
        }
    }
    /// <summary>
    /// Добавление строки в таблицу.
    /// </summary>
    /// <returns>Возвращает таблицу с добавленной строкой.</returns>
    private dynamic AddRow()
    {
        var table = _wdDoc.Tables[1];
        table.Rows.Add();
        return table;
    }
    /// <summary>
    /// Подгонка высоты строки.
    /// </summary>
    /// <param name="table">Таблица</param>
    /// <param name="row">Номер строки, начиная с 1.</param>
    /// <param name="height">Минимальная высота</param>
    private static void AutoSizeRow(dynamic table, int row, float height = 0.1f)
    {
        table.Cell(row, 11).Range.Rows.HeightRule = 1;//wdRowHeightAtLeast
        table.Cell(row, 11).Range.Rows.Height = height * CENTIMETRES_TO_POINTS;
    }
 
    private void Close()
    {
        _wdDoc?.Close();
        _wdApp?.Quit(false);
    }
 
    #region Implementation of IDisposable
 
    public void Dispose()
    {
        Close();
    }
 
    #endregion
}

Я использую позднее связывание через dynamiс, чтобы не зависеть от установленной версии Word.
Библиотека с моделью данных, её тесты и пример использования на WinForms лежат здесь.
Это уже можно использовать в качестве отправной точки.

Вернуться к обсуждению:
Создание таблиц в MS Word
1
Заказывайте контрольные, курсовые и дипломы здесь.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2017, 05:24

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

Автоматическое создание таблиц из наименований таблиц, имен полей, типов полей
Форумчане, доброго времени суток! Есть таблица в которую автоматом выгрузили имена всех таблиц,...

Формирование таблиц Word
Доброго времени суток, господа программеры! Есть небольшая проблемка, пытаюсь ее решить, теперь и с...

Баг таблиц Word
Добрый день форумчане. Столкнулся с такой проблемой: У некоторых таблиц в ворде случайным образом...

Редактирование таблиц в WOrD
Как можно уменьшить время форматирования таблиц ? В данный момент макрос перебирает каждую строку,...

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