IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Chyba v exportu dat do pdf a Excel

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Maros2470
Člen
Avatar
Maros2470:17.1.2020 20:24

Zdravím.

Vytvářím aplikaci skladového hospodářství. V podstatě mám vše napsané. Naposled jsem začal dělat exporty. Problém je v tom, že v testovací databázi mám jen jednu položku, ale v exportech se mi zobrazí čtyřikrát. můžete poradit kde mám chybu? Díky.

Tady je kód:

DataTable

namespace Sklad.DataTables
{
    public class DtSklad : CommandViewModel
    {
        public readonly UserSettingService _userService;

        public DtSklad(UserSettingService userService)
        {
            _userService = userService;
        }

        public DataTable SkladDataTable()
        {
            DataTable friend = new DataTable();
            friend.Columns.Add("Kód");
            friend.Columns.Add("Materiál");
            friend.Columns.Add("Jednotka");
            friend.Columns.Add("Limit");
            friend.Columns.Add("Zústatek");
            friend.Columns.Add("Datum");

            foreach (SkladMaterialu skl in Sklady)
                foreach (Jednotka j in Jednotky)
                {
                    friend.Rows.Add(skl.Kod, skl.Material, skl.Jednotka.Zkratka, skl.Limit, skl.Zustatek, skl.Datum.ToShortDateString());
                }
            return friend;
        }
    }
}

DataSet

namespace Sklad.DataSets
{
    public class DsSklad : CommandViewModel
    {
        public readonly UserSettingService _userService;

        public DsSklad(UserSettingService userService)
        {
            _userService = userService;
        }

        public DataSet SkladDataSet()
        {
            DataSet ds = new DataSet();
            DataTable dtbl = new DataTable();
            dtbl.Columns.Add("Kód");
            dtbl.Columns.Add("Materiál");
            dtbl.Columns.Add("Jednotka");
            dtbl.Columns.Add("Limit");
            dtbl.Columns.Add("Zústatek");
            dtbl.Columns.Add("Datum");

            foreach (SkladMaterialu skl in Sklady)
                foreach (Jednotka j in Jednotky)

                {
                    dtbl.Rows.Add(skl.Kod, skl.Material, skl.Jednotka.Zkratka, skl.Limit, skl.Zustatek, skl.Datum.ToShortDateString());
                }

            dtbl.TableName = "Sklad";
            ds.Tables.Add(dtbl);
            return ds;
        }

Export

namespace Sklad.Exports
{
    public class ExportSklad : CommandViewModel
    {
        public readonly UserSettingService _userService;
        public int ObsluhaId { get { return _userService.ObsluhaId; } set { _userService.ObsluhaId = value; } }

        public ExportSklad(UserSettingService userService)
        {
            _userService = userService;
        }

        //Export PDF
        public void ExportDataTableToPdf(System.Data.DataTable dtblTable, String strPath )
        {
            try
            {
                FileStream fs = new FileStream(strPath, FileMode.Create, FileAccess.Write, FileShare.None);
                Document document = new iTextSharp.text.Document();
                document.SetPageSize(PageSize.A4);
                PdfWriter writer = PdfWriter.GetInstance(document, fs);
                document.Open();

                //Hlavička dokumentu
                BaseFont bf = BaseFont.CreateFont(Environment.GetEnvironmentVariable("windir") + @"\fonts\ARIAL.TTF", BaseFont.IDENTITY_H, true);
                iTextSharp.text.Font fntHead = new iTextSharp.text.Font(bf, 16, 1, BaseColor.GRAY);
                iTextSharp.text.Font fntColumnHeader = new iTextSharp.text.Font(bf, 8, 1, BaseColor.WHITE);
                iTextSharp.text.Font fntCell = new iTextSharp.text.Font(bf, 8, 1, BaseColor.BLACK);
                Paragraph prgHeading = new Paragraph
                {
                    Alignment = Element.ALIGN_CENTER
                };
                prgHeading.Add(new Chunk("Stav skladu ke dni " + DateTime.Today.ToShortDateString(), fntHead));
                document.Add(prgHeading);

                LineSeparator ls = new LineSeparator
                {
                    Alignment = Element.ALIGN_LEFT,
                    LineColor = BaseColor.BLACK,
                    LineWidth = 0.0F,
                    Percentage = 100.0F
                };
                Paragraph p = new Paragraph(new Chunk(ls));
                document.Add(new Chunk("\n", fntHead));

                //Zápis tabulky
                PdfPTable table = new PdfPTable(dtblTable.Columns.Count)
                {
                    HorizontalAlignment = 0,
                    TotalWidth = 520f,
                    LockedWidth = true
                };
                float[] widths = new float[] { 50f, 250f, 25f, 45f, 45f, 50f };
                table.SetWidths(widths);
                table.DefaultCell.Phrase = new Phrase() { Font = fntColumnHeader };

                //Hlavička tabulky
                for (int i = 0; i < dtblTable.Columns.Count; i++)
                {
                    PdfPCell cell = new PdfPCell
                    {
                        BackgroundColor = BaseColor.GRAY,
                        VerticalAlignment = 0,
                        HorizontalAlignment = 0
                    };
                    cell.AddElement(new Phrase(dtblTable.Columns[i].ColumnName, fntColumnHeader));
                    table.AddCell(cell);
                }

                //Data tabulky
                for (int i = 0; i < dtblTable.Rows.Count; i++)
                {
                    for (int j = 0; j < dtblTable.Columns.Count; j++)
                    {
                        table.AddCell(new Phrase(dtblTable.Rows[i][j].ToString(), fntCell));
                    }
                }
                document.Add(table);

                //Autor
                Paragraph prgAuthor = new Paragraph();
                iTextSharp.text.Font fntAuthor = new iTextSharp.text.Font(bf, 8, 2, BaseColor.GRAY);
                prgAuthor.Alignment = Element.ALIGN_RIGHT;
                prgAuthor.Add(new Chunk("Autor: Marek Šimčík, dne " + DateTime.Today.ToShortDateString(), fntAuthor));
                document.Add(prgAuthor);

                document.Close();
                writer.Close();
                fs.Close();
                WPFMessageBox.Show("Export do souboru PDF byl dokončen");
            }
            catch (Exception _ex)
            {
                WPFMessageBox.Show(_ex.Message);
            }
        }

        //Export Excel
        public void ExportDataSetToExcel(DataSet ds, string strPath)
        {
            try
            {
                int inHeaderLenght = 3, inColumn = 0, inRow = 0;
                System.Reflection.Missing Default = System.Reflection.Missing.Value;

                // Create Excel File

                Application excelApp = new Application();
                Workbook excelWorkBook = excelApp.Workbooks.Add(1);
                foreach (System.Data.DataTable dtbl in ds.Tables)
                {
                    Worksheet excelWorksheet = excelWorkBook.Sheets.Add(Default, excelWorkBook.Sheets[excelWorkBook.Sheets.Count], 1, Default);
                    excelWorksheet.Name = dtbl.TableName;

                    for (int i = 0; i < dtbl.Columns.Count; i++)
                        excelWorksheet.Cells[inHeaderLenght + 1, i + 1] = dtbl.Columns[i].ColumnName.ToUpper(new CultureInfo("cs-CZ", false));

                    for (int m = 0; m < dtbl.Rows.Count; m++)
                    {
                        for (int n = 0; n < dtbl.Columns.Count; n++)
                        {
                            inColumn = n + 1;
                            inRow = inHeaderLenght + 2 + m;
                            excelWorksheet.Cells[inRow, inColumn] = dtbl.Rows[m].ItemArray[n].ToString();
                            if (m % 2 == 0)
                            {
                                excelWorksheet.get_Range("A" + inRow.ToString(new CultureInfo("cs-CZ", false)), "F" + inRow.ToString(new CultureInfo("cs-CZ", false))).Interior.Color = ColorTranslator.FromHtml("#FCE4D6");
                            }
                        }
                    }

                    // Excel hlavička
                    Range cellRang = excelWorksheet.get_Range("A1", "F3");
                    cellRang.Merge(false);

                    cellRang.BorderAround2(Excel.XlLineStyle.xlContinuous, XlBorderWeight.xlMedium, XlColorIndex.xlColorIndexAutomatic);
                    cellRang.Interior.Color = Color.White;
                    cellRang.Font.Color = Color.Gray;
                    cellRang.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                    cellRang.VerticalAlignment = XlVAlign.xlVAlignCenter;
                    cellRang.Font.Size = 22;
                    excelWorksheet.Cells[1, 1] = "Stav skladu ke dni " + DateTime.Today.ToShortDateString();

                    Borders xBorders = cellRang.Borders;
                    xBorders.LineStyle = XlLineStyle.xlContinuous;
                    xBorders.Weight = 3d;

                    // Excel záhlaví sloupců
                    cellRang = excelWorksheet.get_Range("A4", "F4");

                    cellRang.Font.Bold = true;
                    cellRang.Font.Color = ColorTranslator.ToOle(Color.White);
                    cellRang.Interior.Color = ColorTranslator.FromHtml("#ED7D31");

                    excelWorksheet.get_Range("A4", "F4").EntireColumn.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                    excelWorksheet.get_Range("C5", "F5").NumberFormat = "#,###.00";
                    excelWorksheet.Columns.AutoFit();

                    //Delete FirstPage
                    excelApp.DisplayAlerts = false;
                    Worksheet lastWorksheet = (Worksheet)excelWorkBook.Worksheets[1];
                    lastWorksheet.Delete();
                    excelApp.DisplayAlerts = true;
                    //Set DefaultPage
                    (excelWorkBook.Sheets[1] as _Worksheet).Activate();

                    excelWorkBook.SaveAs(strPath, Default, Default, Default, false, Default, XlSaveAsAccessMode.xlNoChange, Default, Default, Default, Default, Default);
                    excelWorkBook.Close();
                    excelApp.Quit();
                    WPFMessageBox.Show("Export do souboru Excel byl dokončen");
                }
            }
            catch (Exception _ex)
            {
                WPFMessageBox.Show(_ex.Message);
            }
        }
    }
}

ViewModel

namespace Sklad.ViewModels
{
    public class SkladViewModel : CommandViewModel
    {

        private readonly UserSettingService _userService;

        private readonly string strPdfPath = ZakladniFce.GetAttachmentDirectory() + "Stav skladu ke dni " + DateTime.Today.ToShortDateString() + ".pdf";
        private readonly string strExcelPath = ZakladniFce.GetAttachmentDirectory() + "Stav skladu ke dni " + DateTime.Today.ToShortDateString() + ".xlsx";

public void ExportPdf()
        {
            DtSklad dts = new DtSklad(_userService);
            ExportSklad expdf = new ExportSklad(_userService);
            DataTable dtbl = dts.SkladDataTable();
            expdf.ExportDataTableToPdf(dtbl, strPdfPath);
        }

        public void ExportExcel()
        {
            DsSklad dss = new DsSklad(_userService);
            ExportSklad exex = new ExportSklad(_userService);
            DataSet dsData = dss.SkladDataSet();
            exex.ExportDataSetToExcel(dsData, strExcelPath);
        }

        public ICommand ExportExcelCommand { get { return new CommandHandler(() => ExportExcel(), _canExecute); } }
        public ICommand ExportPdfCommand { get { return new CommandHandler(() => ExportPdf(), _canExecute); } }
    }
}

Díky za radu.

Zkusil jsem: Zkoušel jsem toho více, ale uvízl jsem na mrtvém bodě

Chci docílit: Jednak se snažím něco naučit i v mém věku, ale hlavně potřebuji jednoduchou aplikaci do práce. Evidence materiálu, export stavu skladu, skladových pohybů a inventur.

 
Odpovědět
17.1.2020 20:24
Avatar
Maros2470
Člen
Avatar
Odpovídá na Maros2470
Maros2470:17.1.2020 20:30

Vyřešeno!
Chyba byla zde:

foreach (SkladMaterialu skl in Sklady)
                foreach (Jednotka j in Jednotky)

                {
                    dtbl.Rows.Add(skl.Kod, skl.Material, skl.Jednotka.Zkratka, skl.Limit, skl.Zustatek, skl.Datum.ToShortDateString());
                }

má to být takto

foreach (SkladMaterialu skl in Sklady)

                {
                    dtbl.Rows.Add(skl.Kod, skl.Material, skl.Jednotka.Zkratka, skl.Limit, skl.Zustatek, skl.Datum.ToShortDateString());
                }

Načetlo se to dvakrát.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
17.1.2020 20:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.