Как разобрать "вырезать и вставить" из Excel - PullRequest
4 голосов
/ 21 января 2009

Для части веб-приложения пользователю необходимо импортировать некоторые данные из электронной таблицы. Например, список имен и адресов электронной почты. В настоящее время мы делаем это, прося пользователя найти и загрузить файл CSV.

К сожалению, это не всегда возможно, поскольку различные корпоративные ИТ-системы позволяют пользователям получать доступ к файлам только из систем управления документами, и у них нет привилегий сохранять их на локальном диске или в общей сетевой папке.

Решение, которое мы имеем, состоит в том, чтобы позволить пользователю вырезать и вставить весь лист (CSV) в текстовую область и отправить его. Сделав это, вы получите хороший разделенный табуляцией список данных, который легко анализируется, как показано ниже.

Lorem   ipsum   dolor   sit amet
consectetur adipiscing  elit    Vivamus fermentum
Vivamus et  diam    eu  eros
egestas rutrum  Morbi   id  neque
id  enim    molestie    tincidunt   Nullam

К сожалению, различные клетки могут давать неожиданные результаты. В приведенном ниже наборе вы можете увидеть "внутри слова prerium", вкладку со словом Suspendisse и разрыв строки внутри слова sollicitudin.

bibendum    ante    molestie    lectus  Sed
pret"ium    "Susp   endisse"    "sollic
itudin" nisi    at
urna    Sed sit amet    odio
eu  neque   egestas tincidunt   Nunc
metus   Curabitur   at  nibh    Nulla

В этом случае я не могу просто разделить табуляцию и разрывы строк без более совершенного механизма для обработки вкладок, цитат и разрывов строк в реальных данных.

Кто-нибудь знает какой-нибудь код, который может справиться с этим надежно? Или даже если можно использовать Excel и подобный буфер обмена для получения стабильных результатов?

Я работаю в Asp.net 3.5, используя C #. Версия Excel для пользователей может отличаться, но всегда должна быть Windows 2000 / XP / Vista и IE 6/7.

Ответы [ 5 ]

1 голос
/ 21 января 2009

Для меня это выглядит как список "значений с разделителями", поэтому в основном такой же, как CSV с TAB в качестве разделителя полей и разрыв строки в качестве разделителя строк. Вы можете попробовать это с библиотекой CSV Reader из CodeProject , она должна обрабатывать различные разделители, а не только запятую.

0 голосов
/ 01 июля 2014

Вы можете использовать класс TextFieldParser, который Microsoft уже предоставляет: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio(v=vs.110).aspx

0 голосов
/ 21 января 2009

Из быстрой проверки можно создать значение ячейки Excel, которое содержит вкладку (попробуйте ="abc"&CHAR(9)&"def" и скопируйте ячейку в текстовую область html) и одну или несколько кавычек (например, ="this has""one quote"). Я не вижу абсолютно надежного способа убедиться, что вы получаете.

Проблема в том, что вы не имеете никакого реального контроля над взаимодействием между Excel (в качестве источника) и текстовой областью в браузере (в качестве цели вставки). Я даже не уверен, что результат будет одинаковым в разных браузерах!

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

Учитывая, что некорректно сформированные данные должны быть исключением, я думаю, что я бы продолжил и написал парсер (вы могли бы сделать это с помощью регулярного выражения или двух) для «нормального» случая и представил бы проанализированные данные обратно пользователю для подтверждения, с возможностью редактировать строки, которые не были проанализированы должным образом. С небольшой магией Ajax, я думаю, вы могли бы доставить что-то довольно гладкое.

0 голосов
/ 21 января 2009

Я видел одно решение с вставкой CSV-файлов, которое включало получение данных из буфера обмена в IDataObject, а затем считывание каждой строки CSV-объекта в объект данных с использованием StreamReader с IDataObject.GetData ("CSV").

Возможно, это будет немного надежнее, чем вставить CSV в текстовое поле, а затем вставить его в другой объект данных.

Извините, у меня нет примера кода, я постараюсь отредактировать его, когда у меня будет время, и попробую.

0 голосов
/ 21 января 2009

попробуйте найти что-нибудь полезное в Членах System.Windows.Forms.Clipboard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...