Можно ли читать данные Excel из указанных ячеек c, используя PX.Data.XLSXReader? - PullRequest
0 голосов
/ 13 февраля 2020

Можно ли читать данные Excel из указанных ячеек c, используя PX.Data.XLSXReader? Я пытаюсь прочитать указанный столбец c из файла Excel, используя библиотеку Acumatica XLSXReader, но мне не удалось найти функцию для получения информации о конкретных ячейках c - например, H7. Казалось бы, мне нужно определить индекс для столбцов, чтобы перебрать и получить информацию. Однако в моем случае файл excel не содержит информации в первой строке, и мы не можем изменить ее, поскольку она автоматически создается третьей стороной. Это мое действие:

    [PXUIField(DisplayName = "Upload Data", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = true)]
    [PXButton()]
    public virtual IEnumerable uploadFileBatch(PXAdapter adapter)
    {
        string complete = "";
        if (this.NewFilePanel.AskExt() == WebDialogResult.OK)
        {
            PX.SM.FileInfo info = PXContext.SessionTyped<PXSessionStatePXData>().FileInfo[SessionKey] as PX.SM.FileInfo;
            byte[] bytes = info.BinData;
            List<string> pONotFound = new List<string>();
            using (PX.Data.XLSXReader reader = new XLSXReader(bytes))
            {
                reader.Reset();
                Dictionary<String, Int32> indexes = reader.IndexKeyPairs.ToDictionary(p => p.Value.ToUpper(), p => p.Key);
                while (reader.MoveNext())
                {
                    //This is correct when there is info in the first row with those titles
                    string data = reader.GetValue(indexes["TITLE"]).Trim() + "\n";
                    //However I would like to do something like this
                    string data2 = reader.GetValue("H7").Trim() + "\n";
                }
            }
        }
    }

Также я заметил, что когда я не включаю

 Dictionary<String, Int32> indexes = reader.IndexKeyPairs.ToDictionary(p => p.Value.ToUpper(), p => p.Key);

, код не повторяется с

 reader.MoveNext()

Я понимаю, почему Acumatica использует первую строку для идентификации столбцов и помогает с отображением при загрузке документов - но я думаю об управлении библиотекой с большей гибкостью - если это возможно.

1 Ответ

2 голосов
/ 13 февраля 2020

Можно ли читать данные Excel из указанных ячеек c, используя PX.Data.XLSXReader?

Да, можно получить указанную ячейку c строки используя метод GetValue, как в вашем примере.

Невозможно иметь произвольный доступ к строкам, так как они используют IEnumerator:

IEnumerator<Worksheet.Row> _rowIterator;

Однако первая строка - это особый случай, который доступ через свойство IndexKeyPairs.

Кроме того, я заметил, что когда я не включаю […], код не повторяется с

Доступ к Свойство IndexKeyPairs имеет побочный эффект назначения приватного члена _keys. Возможно, этот побочный эффект меняет поведение класса XLSXReader.

public IDictionary<int, string> IndexKeyPairs
{
    get
    {
        if (_keys == null)
        {
            _keys = new Dictionary<int, string>();
            if (_headerRow != null)
                foreach (Worksheet.Cell cell in _headerRow.Cells)
                    _keys.Add(new KeyValuePair<int, string>(cell.Address.Column, GetValue(cell)));
        }
        return _keys;
    }
}

Я думаю об управлении библиотекой с большей гибкостью - если возможно.

Библиотека была оптимизирована для скорости, которая требует последовательного итератора вместо произвольного доступа. Это может быть не так удобно, но метод MoveNext предназначен для быстрой работы. Чтобы получить доступ к указанной строке c, вызовите метод Reset, чтобы сбросить итератор, и несколько раз вызывайте MoveNext, пока не будет достигнута целевая строка.

Чтобы оценить доступные функции, предоставляемые классом XLSXReader, найдите интерфейс IContentReader:

public interface IContentReader : IDisposable
{
    /// <summary>
    /// Move to next record in data source
    /// </summary>
    /// <returns>true, if the operation was performed successfully</returns>
    bool MoveNext();

    /// <summary>
    /// Find value in record by given key index
    /// </summary>
    /// <param name="index">index of value</param>
    /// <returns>null, if given key index was not found</returns>
    string GetValue(int index);

    /// <summary>
    /// Reset state of reader
    /// </summary>
    void Reset();

    /// <summary>
    /// Collection of value keys
    /// </summary>
    IDictionary<int, string> IndexKeyPairs { get; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...