我正在尝试通过使用开放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未打开。
答案 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