【问题标题】:Save excel file from internet从互联网保存excel文件
【发布时间】:2012-09-24 11:07:57
【问题描述】:

我正在尝试使用 Selenium 从站点下载 Excel 文件。

我的做法:

    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 无法打开保存的文件。

如何正确保存文件?

【问题讨论】:

    标签: java excel encoding selenium utf-8


    【解决方案1】:

    您可以尝试使用String.getBytes() 将字符重新编码回字节流,但这可能仍然行不通。

    基本上,为了将 Excel 文件的二进制数据保存在字符串中,必须使用字符集对数据进行解码。因为不应将 excel 文件作为纯文本读取,所以可能有很多字节序列不是有效的字符编码。这些字节序列在解码为String 时可能只表示为“?” (尽管这取决于实际使用的Charset)。当您尝试使用 String.getBytes() 或任何其他方法重新编码字符时,那些“?”字符不会被转换回它们的原始字节,而是会被转换为 unicode 问号字符的编码,这对于 excel 文件格式几乎肯定是无效的。

    真正的问题是,为什么需要通过 Se 下载这个文件? Se 是关于测试浏览器如何呈现网页的。如果您需要 Excel 文件,为什么不直接从您单击 Se 的链接中获取 href,然后使用简单的 HttpUrlConnection 使用标准二进制文件 InputStream 下载文件?

    【讨论】:

    • 嗯,excel 文件是通过执行 java 脚本生成的,我只是不知道最终 url 的精确链接。我正在开发的解决方案旨在在站点上行走并收集数据,有时还用于下载文件。以 Selenuim 允许的方式获取数据似乎更容易
    【解决方案2】:

    我想通了。

    我只需要在单击加载文件按钮后从最后一页获取输入流。 但是获取页面对象'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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多