【问题标题】:Convert byte[] from xls into xlsx file and save it将 byte[] 从 xls 转换为 xlsx 文件并保存
【发布时间】:2019-05-14 23:03:59
【问题描述】:

我正在尝试将从其他地方的 XLS 文件中获得的字节 [] 转换为新的 XLSX 文件并保存。我正在使用 Free Spire.XML,但不知道该怎么做。

public byte[] ConvierteAXLSX(string cuerpo)
{
    Workbook wb = new Workbook();
    Worksheet sheet = wb.Worksheets[0];
    byte[] array = Convert.FromBase64String(cuerpo);
    sheet.InsertArray(array, 1, 1, true);
    wb.SaveToFile(AppDomain.CurrentDomain.BaseDirectory +  "sample.xlsx", ExcelVersion.Version2013);
    byte[] fileContent = File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "sample.xlsx");
    //File.Delete(AppDomain.CurrentDomain.BaseDirectory + "sample.xlsx");
    return fileContent;
}

此代码创建 XLSX 文件,但只是将 byte[] 像数组一样插入到 excel 文件中,而不是转换数据。

编辑:

我的问题与其他问题略有不同。我不能只读取原始文件然后再次保存,因为该文件位于另一台服务器中并且无法访问它。我能做的最好的事情是发送文档正文并将其解析为字节 []。

如果我可以将我的 byte[] 转换为 XLS 文件并保存它,它也可以工作,然后我可以使用其他类似问题的答案。

Workbook workbook = new Workbook();
workbook.LoadFromFile("Input.xls");
workbook.SaveToFile("Output.xlsx", ExcelVersion.Version2013);

【问题讨论】:

  • 从根本上说 .xls 和 .xlsx 是不一样的,你不能只取字节并在它们之间进行转换。
  • How to convert xls file to xlsx file using C#? 的可能重复项(如果您不介意删除中间的byte[] 步骤..)
  • 您的编辑令人困惑。您无法读取/访问文件,但可以发送/解析正文?除非我误解了什么,否则这听起来很矛盾。

标签: c# excel xls excel-interop


【解决方案1】:

这不会发生冲突,因为这两种文件类型存储的数据完全不同。 xls 文件中的数据以专有的二进制格式存储,xmls 文件数据存储在 Open XML 中。

【讨论】:

    【解决方案2】:

    我做到了,将 byte[] 保存到 XLS 文件中,读取它并再次将其保存到 XLSX 文件中。

    public byte[] ConvierteAXLSX(string cuerpo)
            {
                File.WriteAllBytes(AppDomain.CurrentDomain.BaseDirectory + "viejo.xls", Convert.FromBase64String(cuerpo));
                Workbook workbook = new Workbook();
                workbook.LoadFromFile(AppDomain.CurrentDomain.BaseDirectory + "viejo.xls");
                workbook.SaveToFile(AppDomain.CurrentDomain.BaseDirectory + "nuevo.xlsx", ExcelVersion.Version2013);
                byte[] fileContent = File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "nuevo.xlsx");
                File.Delete(AppDomain.CurrentDomain.BaseDirectory + "viejo.xls");
                File.Delete(AppDomain.CurrentDomain.BaseDirectory + "nuevo.xlsx");
                return fileContent;
            }
    

    感谢您的帮助!

    【讨论】: