示例#1
0
        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;
        }
示例#2
0
        /// <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
        }
示例#3
0
 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;
 }
示例#4
0
        /// <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);
            }
        }