При извлечении данных из Excel лист возвращается пустым, если файл остается открытым в Excel - PullRequest
0 голосов
/ 07 мая 2018

Я использую следующий код для извлечения данных из листов в рабочей книге с использованием EPPlus. Код работает нормально, кроме случаев, когда рабочая книга открыта в Excel. Код не возвращает данных, если файл Excel остается открытым пользователем. Как я могу решить эту проблему?

var fileInfo = new FileInfo(@file);

using (var package = new ExcelPackage(fileInfo))
                {
                    label_snum.Text = package.Workbook.Worksheets.Count.ToString();
                    // Itterate through workbook sheets
                    foreach (var sheet in package.Workbook.Worksheets)
                    {
                        label_csheet.Text = sheet.Name;
                        // Itterate through each column until final column
                        for (int i = 1; i <= sheet.Dimension.End.Column; i++)
                        {
                            for (int j = 1; j <= sheet.Dimension.End.Row; j++)
                            {
                                if (sheet.Cells[j, i].Text.Length != 0)
                                {

                                }
                             }    
                    }  
                }                  

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Обратитесь к ответу здесь , который я изначально связал как комментарий.

new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

Более подробно, файл не может быть прочитан при передаче FileInfo в ExcelPackage, если он используется другим процессом.

До версии 4.5.1 EPPlus , ExcelPackage использует System.IO.File.ReadAllBytes для загрузки файла. ReadAllBytes использует неправильную настройку FileShare.Read, поскольку Excel открывает файлы с использованием настройки FileShare.ReadWrite.

Когда вы открываете уже открытый файл, вам также необходимо использовать такой же FileShare параметр . Таким образом, используя FileStream, вы можете указать правильный FileShare.

Начиная с v4.5.1 , ExcelPackage теперь делает это для вас сейчас при прохождении FileInfo.

0 голосов
/ 08 мая 2018

Задумывались ли вы о попытке подключиться к файлу Excel, используя строку подключения вместо попытки доступа к открытому файлу?

ConnectionString: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PathtoYourExcelFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

Затем вы можете использовать запросы Linq / SQL для извлечения данных.

"SELECT * FROM [sheet1$]" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...