Problem z Excel - EPPlus i LinqToExcel

0

Cześć,
Mam sobie plik Excel, który próbuję otworzyć w EPPlus czy LinqToExcel.
Wywala się z komunikatem External table is not in the expected format.

Co ciekawe, jak otworze ten plik w Excelu (aplikacji a nie w kodzie) i zapiszę, to plik mogę wówczas otworzyć
zarówno w EPPlus i LinqToExcel.
(Po otworzeniu w Office excela i zapisaniu, plik zmienia wielkosc z 59 na 79KB).
Wskazywałoby to na jakiś dziwny format pliku ale nie mogę dojść co jest z nim nie tak.

Może ktoś ew. zerknąć i spróbować otworzyć ten plik?

http://static.lajtit.pl/test.xlsx

Kawałek kodu:

            string Filepath = @"C:\test.xlsx";
            FileInfo importFileInfo = new FileInfo(Filepath);
            using (var excelPackage = new ExcelPackage(importFileInfo))
            {
                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[1];  // tu pokazuje Worksheets jako null
                int rowCount = worksheet.Dimension.Start.Row;
                int colCount = worksheet.Dimension.End.Row;
            }

drugi kod

           ExcelQueryFactory eqf = new ExcelQueryFactory(saveLocation);

            var r = from p in eqf.Worksheet<testXlsxFile>(0) select p; // tu rzuca błąd

            var rr = r.ToList();

0

Plik jest generowany przez jakiś inny program? Bo jak otworzysz w Excel'u i wykryje że są błędy w strukturze pliku ale jest w stanie je naprawic to "regeneruje plik". To by tłumaczyło dlaczego jak go otworzysz i zapiszesz to da się go wczytać, to samo sugeruje zmiana rozmiaru (choć czasem excel dorzuca po prostu jakieś swoje śmieci więc to nie jest 100% wyznacznik).

0
ClassicProgrammer napisał(a):

Plik jest generowany przez jakiś inny program? Bo jak otworzysz w Excel'u i wykryje że są błędy w strukturze pliku ale jest w stanie je naprawic to "regeneruje plik". To by tłumaczyło dlaczego jak go otworzysz i zapiszesz to da się go wczytać, to samo sugeruje zmiana rozmiaru (choć czasem excel dorzuca po prostu jakieś swoje śmieci więc to nie jest 100% wyznacznik).

Tak, plik generowany z zew. systemu.
Może ktoś zna jakiś walidator Excela? Sam Office nie zwraca błędów :(

0

W takim razie plik jest poprawny bo Excel by Cię o tym poinformował.

Szukając dalej pierwszy kod jest na bank dobrze i zwraca prawidłowo worksheet(co prawda nie łapię idei co tam ma się stać) więc się upewnij bo mi null nie leciał na twoim pliku ale pamiętaj że jak zatrzymasz się przed/za usingiem to an debugu będzie null widniał ;)
Natomiast w drugim nie bardzo łapię co chcesz zrobić. Co ogólnie chcesz zrobić?

Stwórz nowy pik w excelu i zobaczy czy z niego zaczyta Worksheet'a.
Może być problem z jakimś sterownikiem na kompie np. Microsoft.ACE.OLEDB.12.0 wtedy przeinstalowac ale to jedna z możliwych przyczyn ale skoro masz Execl'a to raczej bym stawiał ze w kodzie coś jest nie tak.

1

Pisałem kiedyś testy jednostkowe do walidacji czy utworzony plik excela jest poprawny, używałem do tego OpenXML SDK od Microsoftu:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Validation;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Foo.Tests
{
    internal static class AssertEx
    { 
        public static void IsExcelFileValid(string fileNameWithPath)
        {
            OpenSettings os = new OpenSettings();

            using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileNameWithPath, true, os))
            { 
                var xmlValidator = new OpenXmlValidator();

                IEnumerable<ValidationErrorInfo> errors = xmlValidator.Validate(document);

                if (errors.Any())
                {
                    var builder = new StringBuilder();
                    foreach(ValidationErrorInfo info in errors)
                    {
                        builder.AppendLine($"\nT: {info.ErrorType}\nI: {info.Id}\nX: {info.Path.XPath}\nD: {info.Description}\n===========");
                    }

                    Assert.Fail(builder.ToString());
                }
            }
        }
    }
}

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