Сохранить файл Excel из Интернета

Я пытаюсь загрузить файл Excel с сайта с помощью Selenium.

То, как я это делаю:

WebElement excelList = driver.findElement(By.xpath("...")); excelList.click(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); String pageSource = driver.getPageSource(); FileOutputStream fos = new FileOutputStream("d:/load.xls"); for (int i = 0; i < pageSource.length(); i++) { char c = pageSource.charAt(i); fos.write((byte) c); } fos.close(); 

Длина строки источника страницы равна размеру файла, который я загрузил вручную с этого сайта.

Проблема в том, что я неправильно сохраняю данные, и MS Excel не может открыть сохраненный файл.

Как я могу сохранить файл правильно?

Вы можете попробовать использовать String.getBytes() для сортировки повторного кодирования символов обратно в поток байтов, но это, вероятно, еще не сработает.

В принципе, чтобы хранить двоичные данные вашего файла excel в строке, данные должны быть декодированы с использованием набора символов. Поскольку файлы excel не должны читаться как обычный текст, вероятно, существует много байтовых последовательностей, которые не являются допустимыми кодировками символов. Эти байтовые последовательности при декодировании в String , вероятно, будут просто представлены как «?» (хотя это зависит от того, что на самом деле используется Charset ). Когда вы пытаетесь перекодировать символы с помощью String.getBytes() или любого другого метода, это?? символы не собираются преобразовываться обратно в исходные байты, а скорее будут преобразованы в кодировку для символа вопроса юникода, который почти наверняка не подходит для формата файла excel.

Реальный вопрос: зачем вам нужно скачать этот файл через Se? Se рассказывает о том, как браузер отображает веб-страницы. Если вам нужен файл Excel, почему бы просто не захватить href из ссылки, которую вы нажимаете на Se, а затем использовать простой HttpUrlConnection для загрузки файла с использованием стандартного двоичного InputStream ?

Я понял.

Все, что мне нужно, это получить входной поток прямо с последней страницы после нажатия кнопки загрузки файла. Но метод получения объекта страницы «lastPage ()» имеет защищенный доступ.

Вот так:

  private static void saveExcelFile(HtmlUnitDriver driver) { Method m = driver.getClass().getDeclaredMethod("lastPage", null); m.setAccessible(true); Object obj = m.invoke(driver, null); Page page = (Page) obj; InputStream stream = page.getWebResponse().getContentAsStream(); FileOutputStream fos = new FileOutputStream("d:/load.xls"); int c; while ((c = stream.read()) != -1) { fos.write(c); } fos.close(); } 
  • Импорт CSV с использованием UTF-8
  • Действие Web API возвращает FileContentResult, который, если он сохранен как .csv, будет отображаться как тарабарщина, а если в качестве .txt - это нормально. Зачем?
  • VBA Excel Macro записывает файл с использованием кодировки UTF-8
  • Как получить кодировку файла Excel в C #? он всегда возвращает «Windows 1252»
  • Как кодировать UTF-8 для XML-документа в Java
  • экспорт китайского символа в файл excel
  • Как сохранить рабочие листы в виде файлов CSV в формате UTF-8 с помощью Excel для Mac 2011?
  • Excel Экспорт арабского текста английского текста в CSV-файл содержит вопросительные знаки
  • Определение кодировки UTF8 при импорте CSV в VB.Net
  • VBA - кодирование, формат .csv и изменение разделителей
  • Преобразование Excel (XLS) в CSV с помощью UTF-8 с использованием VBA
  • Давайте будем гением компьютера.