private FlowDocument CreateDocument() { // Edited löschen EditedParagraph = null; // Dokument konfigurieren FlowDocument doc = new FlowDocument(); doc.ColumnWidth = 600; doc.ColumnGap = 50; doc.ColumnRuleBrush = Brushes.Red; doc.ColumnRuleWidth = 2; doc.IsColumnWidthFlexible = true; doc.FontSize = 10; doc.FontFamily = new FontFamily("Verdana"); var beos = UnitOfWork.Beobachtungen.GetList(). OrderBy(x => x.SchuljahrId). ThenBy(y => y.Klasse == null ? "" : y.Klasse.Name). ThenBy(z => z.Schueler == null ? "" : z.Schueler.DisplayName). ThenBy(zz => zz.Datum ?? DateTime.MinValue).ToList(); Paragraph p; // Datensätze durchgehen Schueler lastSchueler = null; Klasse lastKlasse = null; DateTime? lastDatum = DateTime.MinValue; Klasse nullKlasse = new Klasse() { Name = "" }; foreach (Beobachtung beo in beos) { bool newPage = false; if (beo.Schueler == null) throw new ArgumentNullException("Schüler in der Beobachtung darf nicht null sein!"); // wenn neue Klasse, dann Kopfzeile schreiben; Seitenumbruch ab der zweiten Klasse var currKlasse = beo.Klasse ?? nullKlasse; if (currKlasse != lastKlasse) { p = new Paragraph() { FontSize = 16, Foreground = Brushes.Red }; if (lastKlasse != null) newPage = p.BreakPageBefore = true; p.Inlines.Add(new Bold(new Run(currKlasse.ToString()))); doc.Blocks.Add(p); } if (lastSchueler != beo.Schueler) { // wenn neuer Schüler, dann Kopfzeile schreiben (und evtl. Seitenumbruch) p = new Paragraph() { FontSize = 14, Foreground = Brushes.Blue }; if (lastSchueler != null && Ribbon.TabBeobachtungenAnsicht.NewPageOnSchüler && !newPage) p.BreakPageBefore = true; p.Inlines.Add(new Bold(new Run(beo.Schueler.DisplayName))); doc.Blocks.Add(p); lastDatum = null; } // Text ausgeben p = new Paragraph() { Tag = beo.BeobachtungId }; p.Margin = new Thickness(70F, 0, 0, 0); if (!beo.Datum.HasValue && lastDatum.HasValue) { p.Inlines.Add(new Run("Kein Datum\t")); p.TextIndent = -70F; } else if (beo.Datum.HasValue && (!lastDatum.HasValue || lastDatum.Value.Date != beo.Datum.Value.Date)) { p.Inlines.Add(new Run(beo.Datum.Value.ToString("dd.MM.yyyy") + "\t")); p.TextIndent = -70F; } p.Inlines.Add(new Run(beo.Text)); // Tooltip setzen p.ToolTip = beo.Fach == null ? "<kein Fach>" : beo.Fach.Name; doc.Blocks.Add(p); /*// Beobachtung ausgeben string beoText = beo.Text; beoText = beoText.Replace("\r", ""); beoText = beoText.Replace("\n", "\v") + "\r"; */ lastKlasse = currKlasse; lastSchueler = beo.Schueler; lastDatum = beo.Datum; } return doc; }
/// <summary> /// Exportiert die übergebenen Beobachtungen in Word /// </summary> /// <param name="Beobachtungen"></param> public void ExportToWord(IEnumerable<Beobachtung> Beobachtungen) { // Wenn keine Datensätze vorhanden sind, abbrechen if (Beobachtungen.Count() == 0) return; #region Gruppierung / Sortierung der Daten // Sortierung zuerst nach Schuljahr ... IOrderedEnumerable<Beobachtung> beos = ExportSettings.DateSortDirection == ListSortDirection.Ascending ? Beobachtungen.OrderBy(x => x.SchuljahrId) : Beobachtungen.OrderByDescending(x => x.SchuljahrId); // ... dann nach Klasse beos = beos.ThenBy(x => x.Schueler.Klassen.FirstOrDefault(y => y.SchuljahrId == x.SchuljahrId).Name); if (ExportSettings.GroupBy == GroupByType.GroupBySchüler) { // ... anschließend nach Schülername beos = beos.ThenBy(x => x.Schueler.DisplayName); // ... und zuletzt nach Datum (null -> Anfang) if (ExportSettings.DateSortDirection == ListSortDirection.Ascending) beos = beos.ThenBy(x => x.Datum.HasValue ? x.Datum.Value : DateTime.MinValue); else beos = beos.ThenByDescending(x => x.Datum.HasValue ? x.Datum.Value : DateTime.MaxValue); } else { // ... oder erst nach Datum (null -> Anfang) if (ExportSettings.DateSortDirection == ListSortDirection.Ascending) beos = beos.ThenBy(x => x.Datum); else beos = beos.ThenByDescending(x => x.Datum ?? DateTime.MaxValue); // ... und danach nach Schülername beos = beos.ThenBy(x => x.Schueler.DisplayName); } #endregion #region Word Dokument initialisieren string FormatGruppenHeader = "Beo_Gruppenname"; string FormatKlassenHeader = "Beo_Klasse"; string FormatDataListe = "Beo_Data_Liste"; string FormatData2Spalten = "Beo_Data_2Spalten"; // Word-Dokument öffnen var app = new Word.ApplicationClass(); app.Visible = true; // Document öffnen Word.Document doc = app.Documents.Add(); #region Formatvorlagen prüfen und notfalls anlegen try { // Standard-Format für Klassen-Überschrift Word.Style s = doc.Styles.Add(FormatKlassenHeader, Word.WdStyleType.wdStyleTypeParagraph); s.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; s.ParagraphFormat.SpaceAfter = 6; s.Shading.ForegroundPatternColor = Word.WdColor.wdColorGray35; s.Font.Name = "Calibri"; s.Font.Size = 14; s.Font.Bold = -1; s.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleDouble; s.set_NextParagraphStyle(doc.Styles["Normal"]); } catch { } try { // Standard-Format für Schülername / Datum Word.Style s = doc.Styles.Add(FormatGruppenHeader, Word.WdStyleType.wdStyleTypeParagraph); s.Font.Size = 14; s.Font.Bold = -1; s.Font.Name = "Calibri"; s.set_NextParagraphStyle(doc.Styles["Normal"]); s.ParagraphFormat.SpaceAfter = 6; s.ParagraphFormat.SpaceBefore = 12; } catch { } try { // Standard-Format für Liste (ohne Datum) Word.Style s = doc.Styles.Add(FormatDataListe, Word.WdStyleType.wdStyleTypeParagraph); s.Font.Name = "Calibri"; s.Font.Size = 10; s.Font.Bold = 0; s.LinkToListTemplate(app.ListGalleries[Word.WdListGalleryType.wdBulletGallery].ListTemplates.get_Item(1), 1); } catch { } try { // Standard-Format für Datumseinträge Word.Style s = doc.Styles.Add(FormatData2Spalten, Word.WdStyleType.wdStyleTypeParagraph); s.Font.Name = "Calibri"; s.Font.Size = 10; s.Font.Bold = 0; float Indent = ExportSettings.GroupBy == GroupByType.GroupBySchüler ? 70F : 120F; s.ParagraphFormat.TabStops.Add(Indent); s.ParagraphFormat.LeftIndent = Indent; s.ParagraphFormat.FirstLineIndent = -Indent; } catch { } #endregion #region Kopf und Fußzeile // Kopf- und Fußzeile anlegen Word.HeaderFooter footer = doc.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary]; Word.Range r = footer.Range; //r.ParagraphFormat.TabStops.Add(200, ref TABleft, ref missing); //r.ParagraphFormat.TabStops.Add(300, ref TABcenter, ref missing); //r.ParagraphFormat.TabStops.Add(550, ref TABright, ref missing); r.Font.Size = 10; r.Text = "\t- Seite "; r.Collapse(Word.WdCollapseDirection.wdCollapseEnd); r.Fields.Add(Range: r, Text: "PAGE", PreserveFormatting: true); r.MoveEnd(); r.InsertAfter("/"); r.Collapse(Word.WdCollapseDirection.wdCollapseEnd); r.Fields.Add(Range: r, Text: "NUMPAGES", PreserveFormatting: true); r.MoveEnd(); r.InsertAfter(" -"); Word.HeaderFooter header = doc.Sections[1].Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary]; r = header.Range; //r.ParagraphFormat.TabStops.Add(200, ref TABleft, ref missing); //r.ParagraphFormat.TabStops.Add(300, ref TABcenter, ref missing); //r.ParagraphFormat.TabStops.Add(550, ref TABright, ref missing); r.Font.Size = 12; r.Text = "\t" + ExportSettings.Header + "\t" + DateTime.Now.ToShortDateString(); #endregion #endregion #region Datensätze ausgeben // Datensätze durchgehen Schueler lastSchueler = null; Klasse lastKlasse = null; DateTime? lastDatum = null; int lastPageNumber = 0; foreach (Beobachtung beo in beos) { if (beo.Schueler == null) throw new ArgumentNullException("Schüler in der Beobachtung darf nicht null sein!"); #region Gruppierungs-Header TextBreakType breakDone = TextBreakType.None; // Neue Klasse ? --> Kopfzeile bzw. neue Seite var currKlasse = beo.Schueler.Klassen.FirstOrDefault(x => x.SchuljahrId == beo.SchuljahrId); if (currKlasse == null) { // Der Schüler wurde in keiner Klasse gefunden ?! currKlasse = new Klasse() { Name = "In keiner Klasse" }; } if (currKlasse != lastKlasse) { // Neue Klasse if (lastKlasse != null && ExportSettings.TextBreakNewKlasse != TextBreakType.None && ExportSettings.TextBreakNewKlasse > breakDone) { // Umbruch nach jeder folgenden Klasse (außer der ersten) if (ExportSettings.TextBreakNewKlasse == TextBreakType.Page) app.Selection.InsertBreak(Word.WdBreakType.wdSectionBreakNextPage); else app.Selection.TypeParagraph(); breakDone = ExportSettings.TextBreakNewKlasse; } // Header ausgeben app.Selection.set_Style(FormatKlassenHeader); app.Selection.TypeText(currKlasse.ToString()); app.Selection.TypeParagraph(); } // Neuer Schüler ? --> Header bzw. neue Seite if (lastSchueler != beo.Schueler) // && groupBy == GroupByType.GroupBySchüler) { // Neuer Schüler if (lastSchueler != null && ExportSettings.TextBreakNewSchüler != TextBreakType.None && ExportSettings.TextBreakNewSchüler > breakDone) { // Umbruch Bei jedem weiteren Schüler (außer dem ersten) if (ExportSettings.TextBreakNewSchüler == TextBreakType.Page) app.Selection.InsertBreak(Word.WdBreakType.wdSectionBreakNextPage); else app.Selection.TypeParagraph(); breakDone = ExportSettings.TextBreakNewSchüler; } // Schülername ausgeben if (ExportSettings.GroupBy == GroupByType.GroupBySchüler) { app.Selection.set_Style(FormatGruppenHeader); app.Selection.TypeText(beo.Schueler.DisplayName); app.Selection.TypeParagraph(); lastDatum = null; } } // Neues Datum? --> Header bzw. neue Seite if ((lastDatum == null || lastDatum.Value.Date != beo.Datum.Value.Date)) // && groupBy == GroupByType.GroupByDatum) { // Neues Datum if (lastDatum != null && ExportSettings.TextBreakNewDatum != TextBreakType.None && ExportSettings.TextBreakNewDatum > breakDone) { // Umbruch Bei jedem weiteren Datum (außer dem ersten) if (ExportSettings.TextBreakNewDatum == TextBreakType.Page) app.Selection.InsertBreak(Word.WdBreakType.wdSectionBreakNextPage); else app.Selection.TypeParagraph(); breakDone = ExportSettings.TextBreakNewDatum; } // Datum ausgeben if (ExportSettings.GroupBy == GroupByType.GroupByDatum) { app.Selection.set_Style(FormatGruppenHeader); app.Selection.TypeText(beo.Datum == null ? "Allgemein" : beo.Datum.Value.ToString("dd.MM.yyyy")); app.Selection.TypeParagraph(); lastSchueler = null; } } // Absatz auf jeden Fall nach Eintrag ? if (ExportSettings.ParagraphAfterEveryEntry && breakDone == TextBreakType.None) app.Selection.TypeParagraph(); // Kopfzeile anpassen, wenn auf neuer Seite if ((int)app.Selection.get_Information(Word.WdInformation.wdActiveEndPageNumber) != lastPageNumber && (lastKlasse != currKlasse || (ExportSettings.GroupBy == GroupByType.GroupBySchüler && lastSchueler != beo.Schueler) || (ExportSettings.GroupBy == GroupByType.GroupByDatum && lastDatum != beo.Datum))) { header = app.Selection.Sections[1].Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary]; header.LinkToPrevious = false; r = header.Range; r.Text = "\t" + ExportSettings.Header + "\t" + DateTime.Now.ToShortDateString() + "\n\t" + currKlasse.ToString() + " - " + (ExportSettings.GroupBy == GroupByType.GroupBySchüler ? beo.Schueler.DisplayName : (beo.Datum == null ? "Allgemein" : beo.Datum.Value.ToShortDateString())); lastPageNumber = (int)app.Selection.get_Information(Word.WdInformation.wdActiveEndPageNumber); } #endregion // Format je nach Beobachtungsart if (beo.Datum == null && ExportSettings.GroupBy == GroupByType.GroupBySchüler) app.Selection.set_Style(FormatDataListe); else { app.Selection.set_Style(FormatData2Spalten); if (ExportSettings.GroupBy == GroupByType.GroupBySchüler) { if (!lastDatum.HasValue || lastDatum.Value.Date != beo.Datum.Value.Date || ExportSettings.RepeatSameName) app.Selection.TypeText(beo.Datum.Value.ToString("dd.MM.yyyy")); app.Selection.TypeText("\t"); } else { if (lastSchueler != beo.Schueler || ExportSettings.RepeatSameName) app.Selection.TypeText(beo.Schueler.DisplayName); app.Selection.TypeText("\t"); } } // Beobachtung ausgeben string beoText = beo.Text; beoText = beoText.Replace("\r", ""); beoText = beoText.Replace("\n", "\v") + "\r"; app.Selection.TypeText(beoText); lastKlasse = currKlasse; lastSchueler = beo.Schueler; lastDatum = beo.Datum; } #endregion }
public void CreateKlasse(string Name) { // Check if exist Klasse x = UnitOfWork.Klassen.Get(Name, Settings.ActiveSchuljahr); if (x == null) { x = UnitOfWork.Klassen.Add(Name, Settings.ActiveSchuljahr); UnitOfWork.Save(); RefreshData(); } SelectedKlasse = x; }
/// <summary> /// Exportiert alle Beobachtungen einer Klasse in Word /// </summary> public void ExportToWord(Klasse Klasse, Schule.DataManager.UowSchuleDB UOW = null) { if (UOW == null) UOW = App.Current.FindResource("UnitOfWork") as Groll.Schule.DataManager.UowSchuleDB; if (UOW != null) { var t = from b in UOW.Beobachtungen.GetList() where (b.Klasse) == Klasse select b; ExportToWord(t); } }