C# 将XLSM转换为XLSX

C# 将XLSM转换为XLSX,c#,openxml,xlsx,epplus,xlsm,C#,Openxml,Xlsx,Epplus,Xlsm,我正在使用EPPLUS库从Excel读取数据以创建另一个文件。不幸的是,它不支持.XLSM扩展名文件。是否有一种很好的方法将.XLSM文件转换为.XLSX文件,以便使用EPPLUS读取该文件 (使用EPPLUS阅读会很好,因为我的所有代码都已经用它编写了:)要做到这一点,您需要使用。下面是一段在我尝试时对我有用的代码: byte[] byteArray = File.ReadAllBytes("C:\\temp\\test.xlsm"); using (MemoryStream stream =

我正在使用EPPLUS库从Excel读取数据以创建另一个文件。不幸的是,它不支持.XLSM扩展名文件。是否有一种很好的方法将.XLSM文件转换为.XLSX文件,以便使用EPPLUS读取该文件


(使用EPPLUS阅读会很好,因为我的所有代码都已经用它编写了:)

要做到这一点,您需要使用。下面是一段在我尝试时对我有用的代码:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\test.xlsm");
using (MemoryStream stream = new MemoryStream())
{
    stream.Write(byteArray, 0, (int)byteArray.Length);
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
    {
       // Change from template type to workbook type
       spreadsheetDoc.ChangeDocumentType(SpreadsheetDocumentType.Workbook);
    }
    File.WriteAllBytes("C:\\temp\\test.xlsx", stream.ToArray()); 
}
这段代码的作用是将启用宏的工作簿文件打开到一个对象中。此对象的类型为
MacroEnabledWorkbook
,但由于您希望将其作为
工作簿
,因此可以调用
ChangeDocumentType
方法将其从
MacroEnabledWorkbook
更改为
工作簿
。这将起作用,因为.xlsm和.xlsx文件之间的底层XML是相同的。

使用,就像amurra的回答一样,但是 除了更改文档类型外,还应删除VbaDataPart和VbaProjectPart,否则Excel将在文件损坏时显示错误

使用(var inputStream=File.OpenRead(“C:\\temp\\test.xlsm”))
使用(var outStream=new MemoryStream()){
输入流。复制到(超出流);
使用(var doc=电子表格文档.Open(扩展,真)){
doc.DeletePartsRecursivelyOfType();
doc.DeletePartsRecursivelyOfType();
doc.ChangeDocumentType(DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook);
}
writealBytes(“C:\\temp\\test.xlsx”,outStream.ToArray());
}
包装xlsbtoxlsx;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.regex.Pattern;
导入org.apache.poi.openxml4j.opc.OPCPackage;
导入org.apache.poi.openxml4j.opc.PackagePart;
导入org.apache.poi.openxml4j.opc.PackageRelationship;
导入org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
导入org.apache.poi.ss.usermodel.WorkbookFactory;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.xssf.usermodel.XSSFWorkbookType;
公共类XlsbToXlsxConvertor{
公共静态void main(字符串[]args)引发异常{
String inputpath=“C:\\Excel数据文件\\XLSB\\CSD\U TDR\U 20200823”;
String outputpath=“C:\\Excel数据文件\\XLSB\\output”;
新的XlsbToXlsxConvertor().XLSMToxlsxFileConverter(inputpath,outputpath);
}
public void XLSMToxlsXFileConverter(字符串输入路径、字符串输出路径)引发异常{
XSSF工作手册;
文件输出流输出;
System.out.println(“inputpath”+inputpath);
文件目录路径=新文件(inputpath);
//所有文件和目录的列表
字符串内容[]=directoryPath.list();
System.out.println(“指定目录中的文件和目录列表:”);
for(int i=0;i
看起来不可能(目前):澄清一下,不要问我是否可以使用EPPlus读取文件。当我询问是否有任何方法/api/其他东西可以用来将xlsm文件转换为xlsx,以便我可以使用ePlusory阅读它时,我知道这是一篇老文章,但我似乎无法实现这一点。我能够获得输出文件(xlsx),但无法在excel中打开该文件。“该文件是一个无宏文件,但包含宏启用内容。”我们如何使用相同的内容将xls转换为xlsm,我遇到了一个错误“文件已损坏”。我不认为您可以,因为xls是office过去使用的旧格式,只为像我一样迷路的人提供一些详细信息,我们需要添加这两个方面:
使用DocumentFormat.OpenXml.Packaging
使用DocumentFormat.OpenXml似乎对我不起作用。我收到一个错误,文件“…是一个无宏文件,但包含启用宏的内容。”转换后没有显示数据,只有灰色背景。
package xlsbtoxlsx;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.regex.Pattern;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbookType;

public class XlsbToXlsxConvertor {

    public static void main(String[] args) throws Exception {
        
        String inputpath="C:\\Excel Data Files\\XLSB\\CSD_TDR_20200823";
        String outputpath="C:\\Excel Data Files\\XLSB\\output";
        
       new XlsbToXlsxConvertor().xlsmToxlsxFileConvertor(inputpath, outputpath);
    }

    public void xlsmToxlsxFileConvertor(String inputpath, String outputpath) throws Exception {
        XSSFWorkbook workbook;
        FileOutputStream out;
        System.out.println("inputpath  " + inputpath);
        File directoryPath = new File(inputpath);
        // List of all files and directories
        String contents[] = directoryPath.list();
        System.out.println("List of files and directories in the specified directory:");
        for (int i = 0; i < contents.length; i++) {
            System.out.println(contents[i]);
            // create workbook from XLSM template
            workbook = (XSSFWorkbook) WorkbookFactory
                    .create(new FileInputStream(inputpath + File.separator + contents[i]));
            // save copy as XLSX ----------------START
            OPCPackage opcpackage = workbook.getPackage();
            // get and remove the vbaProject.bin part from the package
            PackagePart vbapart = opcpackage.getPartsByName(Pattern.compile("/xl/vbaProject.bin")).get(0);
            opcpackage.removePart(vbapart);
            // get and remove the relationship to the removed vbaProject.bin part from the
            // package
            PackagePart wbpart = workbook.getPackagePart();
            PackageRelationshipCollection wbrelcollection = wbpart
                    .getRelationshipsByType("http://schemas.microsoft.com/office/2006/relationships/vbaProject");
            for (PackageRelationship relship : wbrelcollection) {
                wbpart.removeRelationship(relship.getId());
            }
            // set content type to XLSX
            workbook.setWorkbookType(XSSFWorkbookType.XLSX);

            // write out the XLSX

            out = new FileOutputStream(outputpath + File.separator + contents[i].replace(".xlsm", "") + ".xlsx");
            workbook.write(out);
            out.close();
            System.out.println("done");
            workbook.close();
        }
    }

}