TheAbominable Ответов: 1

Загрузка файла excel (для анализа и перемещения данных) в список sharepoint 2010


Я пытаюсь загрузить и проанализировать файл excel в Sharepoint 2010 через веб-часть.

Код, который у меня есть, работает, когда файл excel хранится на сервере (то есть на рабочем столе моего профиля пользователя), но он терпит неудачу, когда я пытаюсь загрузить файл excel через пользовательский интерфейс. При загрузке его через пользовательский интерфейс я могу получить имя файла и несколько других деталей, но внезапно он всегда терпит неудачу в строке выше, где написано "соединение".Открывать();'

Что я могу сделать, чтобы это сработало?

Это часть кода, который у меня есть:

string fileToUpload = uploadExcelFile.FileName;
System.IO.Stream strm = uploadExcelFile.PostedFile.InputStream;
fileName = uploadExcelFile.FileName;

Boolean replaceExistingFiles = true;

byte[] byt = new byte[Convert.ToInt32(uploadExcelFile.PostedFile.ContentLength)];
strm.Read(byt, 0, Convert.ToInt32(uploadExcelFile.PostedFile.ContentLength));
strm.Close();


SPSite localSite = SPContext.Current.Site;
            SPWeb localWeb = localSite.OpenWeb();
            SPFolder ExcelLibrary = localWeb.Folders["ExcelLib"];
            localWeb.AllowUnsafeUpdates = true;
            ExcelLibrary.Files.Add(System.IO.Path.GetFileName(uploadExcelFile.PostedFile.FileName), byt, replaceExistingFiles);
            ExcelLibrary.Update();




string fileExtension = Path.GetExtension(fileName).ToUpper();
                        string connectionString = "";

                        if (fileExtension == ".XLS")
                        {
                            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + fileName + "'; Extended Properties='Excel 8.0;HDR=YES;'";
                        }
                        else if (fileExtension == ".XLSX")                           
                            connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0 Xml;IMEX=1;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text;'";

            String[] excelSheets;

            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open(); // CODE FAILS HERE

                DataTable dtExcelSchema = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

               
Thanks in advance!  I need to get this solved asap. :-(

What I have tried:

I have looked online tirelessly.  This code snippet (above) is well-known and can be found online, however, I wonder why it fails.

[no name]

"хорошо известно и может быть найдено в интернете", и объяснение сообщения об исключении, которое вы видите на своем экране, которое мы вообще не видим, также хорошо известно и может быть легко найдено в интернете.

1 Ответов

Рейтинг:
0

Richard Deeming

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

Путь, предоставляемый элементом управления загрузкой файла, является путем к файлу на клиенте. (Большинство браузеров даже удаляют путь к папке и просто отправляют имя файла.)

Файл не был сохранен в этом пути на сервере. Если бы это было так, то это была бы серьезная уязвимость системы безопасности, поскольку злоумышленники могли бы перезаписать любой файл на вашем сервере, просто манипулируя путем.

Вместо этого вам либо нужно использовать Сохранить как[^] метод сохранения файла в определенную папку на сервере или использование FileContent[^] или FileBytes[^] свойства для доступа к необработанному содержимому файла.

string directory = Path.GetTempPath();
string fileExtension = Path.GetExtension(uploadExcelFile.FileName);
string fileName = Path.Combine(directory, Guid.NewGuid().ToString("N") + fileExtension);

string connection;
if (string.Equals(fileExtension, ".xls", StringComparison.OrdinalIgnoreCase))
{
    connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + fileName + "'; Extended Properties='Excel 8.0;HDR=YES;'";
}
else if (string.Equals(fileExtension, ".xlsx", StringComparison.OrdinalIgnoreCase))
{
    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0 Xml;IMEX=1;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text;'";
}
else
{
    throw new InvalidOperationException("Invalid file type");
}

uploadExcelFile.SaveAs(fileName);

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    ...


TheAbominable

- Спасибо, Ричард. Я обновил свой вопрос, и вы заметите, что я включил код, связанный с процессом загрузки. Я также попытался (код не включен в мой вопрос) загрузить сам файл в библиотеку Sharepoint 2010, и он работает безупречно, однако, когда дело доходит до запуска раздела кода, который читает/анализирует файл, я действительно получаю ошибку в строке connection.open (). Таким образом, файл загружается в библиотеку Sharepiont без проблем, но когда дело доходит до его разбора (чтобы переместить его данные в список Sharepoint), у него возникают проблемы.

Как я уже сказал, я также упростил его и сохранил файл excel локально на сервере (файл находится на myuser\Desktop), используя точно такую же логику, которую вы видите выше, и файл тщательно читается, анализируется, а его данные безупречно перемещаются в список Sharepiont 2010. Есть какие-нибудь идеи относительно того, в чем может быть проблема? Я также попытался загрузить файл и использовать SaveAs ("C:\" + fileName), но это не сработало.

Richard Deeming

Как я и подозревал, вы выбрали путь к файлу на клиенте, и пытается открыть этот файл на сервере.

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

В качестве альтернативы можно использовать библиотеку, которая позволяет читать файл Excel из потока без его предварительного сохранения - например,:
* EPPlus[^];
* ClosedXML[^];
* ExcelDataReader[^];
* SDK OpenXML[^];

TheAbominable

- Спасибо, Ричард.
Я добавил еще больше кода. Как уже упоминалось ранее, при загрузке любого файла из пользовательского интерфейса на сервер мой код может сохранить файл в библиотеке Sharepoint 2010 ["ExcelLib"], и файл успешно сохраняется. Однако при чтении того же файла, который был загружен (с целью его анализа и хранения данных в списке Sharepoint), код завершается неудачей. Не происходит ли это из-за того, что я не сохранил файл на сервере windows? Есть ли какой-нибудь способ прочитать файл непосредственно из того места, где он был сохранен, а именно из библиотеки Sharepoint?

Спасибо.

Richard Deeming

Вы пытаетесь прочитать файл из файловой системы. Для этого файл должен существовать в файловой системе.

Вы не можете просто открыть OleDbConnection на сервере указывая на путь к файлу на клиенте! Это два совершенно разных компьютера, и у них нет доступа к файловым системам друг друга.

Либо сохраните файл на сервере, либо используйте библиотеку, которая позволяет читать файл непосредственно с сервера. InputStream.

TheAbominable

Спасибо за объяснение!
Я попробую оба подхода и посмотрю, какой из них работает лучше. Подходы, которым я буду следовать, таковы:

1) сохраните файл на сервере (я предполагаю, что есть способ удалить файл в конце кода после его чтения)

2) используйте библиотеку, которая позволяет мне читать файл непосредственно из входного потока.

Я буду информировать Вас о своих успехах.

Спасибо!