Загрузка и сохранение файла Excel

#c# #.net #httprequest

#c# #.net #httprequest

Вопрос:

я использую: `private void get_stocks_data() { байт[] результат; байт [] буфер = новый байт [4096];

         WebRequest wr = WebRequest.Create("http://www.tase.co.il/TASE/Pages/ExcelExport.aspx?sn=he-IL_dsamp;enumTblType=AllSecuritiesamp;Columns=he-IL_Columnsamp;Titles=he-IL_Titlesamp;TblId=0amp;ExportType=1");

        using (WebResponse response = wr.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    int count = 0;
                    do
                    {
                        count = responseStream.Read(buffer, 0, buffer.Length);
                        memoryStream.Write(buffer, 0, count);
                    } while (count != 0);
                    result = memoryStream.ToArray();
                    write_data_to_excel(result);

                }
            }
        }`
  

чтобы загрузить файл Excel,

И этот метод для заполнения файла на моем компьютере:

 private void write_data_to_excel(byte[] input)
    {
        StreamWriter str = new StreamWriter("stockdata.xls");

        for (int i = 0; input.Length > i; i  )
        {
            str.WriteLine(input[i].ToString());
        }
        str.Close();
    }
  

В результате я получаю много чисел…
Что я делаю не так? загружаемый файл — это Excel версии 2003, на моем компьютере у меня 2007…
Спасибо.

Ответ №1:

Я бы посоветовал вам использовать WebClient.DownloadFile() вместо этого.

Это метод более высокого уровня, который абстрагируется от создания запроса вручную, работы с кодировкой и т.д.

Комментарии:

1. Хорошо, использование WebClientgives дает некоторый прогресс… но я не загружаю правильный URL… на странице, с которой я загружаю, есть кнопка на его кнопке, которую следует нажать, а затем выбрать загрузку формата Excel 2003 … итак, какой URL я должен указать? страница находится по адресу tase.co.il/TASE/Products/Stocks/MarketData и файл excel выдается при нажатии кнопки на кнопке, на которой есть значок Excel, а затем при выборе excel 2003 (и начале загрузки)… какой URL-адрес я должен указать?

2. В моем случае URL был tase.co.il/TASE/Pages /… {0BDA5110-EF93-44CB-A0F0-468C6F502B51}amp;ExportType= 1, но, похоже, он содержит какой-то токен сеанса, поэтому в нем может быть нечто большее, чем просто получение URL

Ответ №2:

Проблема в вашей функции Write_data_to_excel,
поскольку вы используете StreamWriter.WriteLine метод, ему нужна строка,
вы передаете байт как строку, поэтому ваше двоичное значение, скажем, 10, теперь будет строкой 10,
попробуйте FileStream f = File.OpenWrite("stockdata.xlsx");
f.Write(input,0,input.Length);
, это сработает.

Комментарии:

1. Хорошо, это работает… но теперь я вижу, что загружаю неправильный URL… на странице, с которой я загружаю, есть кнопка на его кнопке, которую следует нажать, а затем выбрать загрузку формата Excel 2003 … итак, какой URL я должен указать? страница находится по адресу tase.co.il/TASE/Products/Stocks/MarketData и файл Excel выдается при нажатии кнопки на кнопке, на которой есть значок Excel, а затем при выборе Excel 2003 (и начале загрузки)… какой URL-адрес я должен указать? Спасибо.

2. На самом деле кнопка Excel запускает еще одну страницу javascript:customWindowOpen('/TASE/Pages/ExcelExport.aspx?sn=noneamp;enumTblType=allSharesamp;Columns=noneColumnsamp;Titles=noneTitlesamp;action=1amp;SubAction=0amp;GridId=33amp;CurGuid={727FE319-7530-460E-9444-E9FB85BCF378}amp;ExportType=1', '_blank', 'scrollbars=yes; toolbar=yes; menubar=yes; resizable=yes', 800, 450);return false; поэтому вы должны вызвать ‘/TASE/Pages/ExcelExport.aspx’ со всеми аргументами, как указано выше, но вам нужно найти параметр to (GridID и CurGuid) каждый раз, когда вы хотите вызвать страницу.