使用开放XML SDK添加电子表格

时间:2015-07-01 21:59:22

标签: c# excel visual-studio openxml-sdk

我正在尝试通过使用开放XML SDK 2.5插入外部加载的图像来更改预先存在的office文档。我计划在excel中执行此操作,方法是将一个工作表附加到工作簿,然后在那里完成所有工作。但是,我似乎无法绕过一个错误。

我的代码是:

    public void insert(String filepath)
    {
        SpreadsheetDocument doc = SpreadsheetDocument.Open(filepath, false);

        // Add a WorksheetPart to the WorkbookPart.
        WorksheetPart worksheetPart = doc.WorkbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());

        // Add Sheets to the Workbook.
        Sheets sheets = doc.WorkbookPart.Workbook.
            AppendChild<Sheets>(new Sheets());

        // Append a new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet()
        {
            Id = doc.WorkbookPart.
            GetIdOfPart(worksheetPart),
            SheetId = 1,
            Name = "mySheet"
        };
        sheets.Append(sheet);

        // Close the document.
        doc.Close();
    }

第6行(添加新的工作表部分)每次尝试测试程序时都会抛出IO异常。大部分代码都来自MSDN。同一个站点建议如果我收到IO异常,我可能输入了错误的文件路径,但绝对不是这样。我还证实我访问的成员确实是公开的,所以我有点困惑。谁能告诉我这个错误可能是什么?我希望这很简单。这是我第一次使用C#。

编辑:我应该提到异常消息还指出“无法打开只读容器”,但我已经验证该文件不是只读的并且excel未打开。

1 个答案:

答案 0 :(得分:1)

打开文件时,您正在将@Override public void show() { // TODO Auto-generated method stub game.assetManager.load("data/secondBackground.pack", TextureAtlas.class); game.assetManager.finishLoading(); stage = new Stage(); TextureAtlas backgroundAtlas = game.assetManager.get("data/secondBackground.pack", TextureAtlas.class); secondBackground = new Image(backgroundAtlas.findRegion("secondBackground")); stage.addActor(secondBackground); secondBackground.setFillParent(true); Color secondBackgroundColor = secondBackground.getColor(); secondBackground.setColor(secondBackgroundColor.r, secondBackgroundColor.g, secondBackgroundColor.b, 0.5f); skin = new Skin(Gdx.files.internal("data/uiskin.json")); Gdx.input.setInputProcessor(stage); final TextField textFieldNickName = new TextField("", skin); textFieldNickName.setMessageText("Nick Name"); textFieldNickName.setAlignment(Align.center); TextFieldStyle textFieldStyle = new TextFieldStyle(); FileHandle fontFile = Gdx.files.internal("data/arial.ttf"); FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile); FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.size = 55; parameter.genMipMaps = true; FreeTypeBitmapFontData fontData = generator.generateData(parameter); BitmapFont ftFont = generator.generateFont(parameter); generator.dispose(); textFieldStyle.font=ftFont; textFieldStyle.fontColor=Color.WHITE; textFieldStyle.cursor = skin.newDrawable("cursor"); textFieldNickName.setStyle(textFieldStyle); Button okButton = new TextButton("OK",skin); Window nickNameWindow = new Window("Enter your nick name", skin); nickNameWindow.setPosition(0, 0); nickNameWindow.defaults().spaceBottom(10); nickNameWindow.row().fill().expandX(); nickNameWindow.add(textFieldNickName).minWidth(stage.getWidth()/3).expandX().fillX(); nickNameWindow.row(); nickNameWindow.add(okButton).minWidth(100).expandX().fillX(); nickNameWindow.pack(); //nickNameWindow.setMovable(false); stage.addActor(nickNameWindow); nickNameWindow.setX(stage.getWidth()/2-nickNameWindow.getWidth()/2); nickNameWindow.setY(stage.getHeight()/2+stage.getHeight()/4-nickNameWindow.getHeight()/2); } 传递给false参数。

isEditable

这使文档成为只读文件。如果您将其更改为SpreadsheetDocument.Open(filepath, false) ,则应该会更好。

更多信息:

我首先将文件内容读入true,然后将其打开。这样可以降低文件损坏的风险。

MemoryStream