Załadowanie pliku .xlsx do .zip

0

Witam,
Potrzebuję stworzyć pliki z rozszerzeniem .xlsx oraz .zip, następnie .xlsx wrzucić do archiwum i wysłać jako załącznik w mailu. Sam plik .xlsx udało mi się wysłać natomiast po dodaniu .xlsx do archiwum wysyłam plik .zip ważący 300 B z nieprawidłowym rozszerzeniem . Byłbym wdzięczny za pomoc.

            var streamExcel = new MemoryStream();
            var streamZip = new MemoryStream();
            var mail = new MailMessage();

            string fileName = "Podmiot.xlsx";
            try
            {
                
                string[] _excelColumns =  { "col1", "col2" };

                using var workbook = new XLWorkbook();

                IXLWorksheet worksheet = workbook.Worksheets.Add("Arkusz1");
                
                int number = 1;
                foreach (string excelColumn in _excelColumns)
                {
                    worksheet.Cell(1, number).Value = excelColumn;
                    number++;
                }
                
                worksheet.Cell(2, 1).Value = model.col1;
                worksheet.Cell(2, 2).Value = model.col2;

                string handle = Guid.NewGuid().ToString();
                workbook.SaveAs(streamExcel);
                streamExcel.Position = 0;
                

                var attachmentStreamExcel = new MemoryStream(streamExcel.ToArray());
                var attachment = new Attachment(attachmentStreamExcel, "Podmiot" + ".xlsx", "application/vnd.openxmlformats- 
                                          officedocument.spreadsheetml.sheet");

                using (var zipArchive = new ZipArchive(streamZip, ZipArchiveMode.Create))
                {
                    ZipArchiveEntry zipArchiveEntry = zipArchive.CreateEntry("Podmiot.xlsx");

                    using (var streamWriter = new StreamWriter(zipArchiveEntry.Open()))
                    {
                        streamWriter.Write(attachment.ContentStream.ReadByte());
                    }
                }

                MemoryStream attachmentStreamZip = new MemoryStream(streamZip.ToArray());


                var mailAttachmet = new Attachment(attachmentStreamZip, "Podmiot" + ".zip", MediaTypeNames.Application.Zip);
                mail.Attachments.Add(mailAttachmet);
2

Plik XLSX jest tak naprawdę plikiem ZIP, tylko o zmienionym rozszerzeniu. Jeżeli chcesz wysłać jeden plik XLSX, to sens pakowania do ZIP jest moim zdaniem wątpliwy, o ile w grę nie wchodzi szyfrowanie (tworzenie archiwum z hasłem).

Rozumiem, że docelowo potrzebujesz móc pakować dowolny plik do ZIP?

0

Docelowo potrzebuje zapakować zawsze jeden plik .xlsx do ZIP który będzie chroniony hasłem.

2

Błąd jest tutaj:

streamWriter.Write(attachment.ContentStream.ReadByte());

odczytujesz i zapisujesz tylko jeden bajt
Niepotrzebnie tworzysz Attachment z tego pliku xlsx skoro nie zamierzasz go załączyć do maila, wystarczy że zrobisz

streamExcel.CopyTo(streamWriter);

a całą część z tworzeniem attachmentu z streamExcel możesz wywalić.

Dodatkowo tak jak wyżej wspomniano xlsx = zip, xlsx też można zabezpieczyć hasłem, nie ma żadnego sensu pakować go w zipa.

0

Dziękuje za pomoc :)

0
andrzejlisek napisał(a):

Plik XLSX jest tak naprawdę plikiem ZIP, tylko o zmienionym rozszerzeniu. Jeżeli chcesz wysłać jeden plik XLSX, to sens pakowania do ZIP jest moim zdaniem wątpliwy, o ile w grę nie wchodzi szyfrowanie (tworzenie archiwum z hasłem).

Jako ciekawostkę podam, że MS Office dość słabo zipuje dokumenty, pewnie dla przyspieszenia tej operacji. Napisałem kiedyś skrypt rozpakowujący dowolny docx/xlsx i pakujący do nowego zipa za pomocą 7zip z maksymalnymi flagami. Dawało to jakieś 10-20% mniejszy plik który nadal normalnie się otwierał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1