Archive for 2012/2/23
昨日、FxUGにてairxzipの紹介をしてきました。
そのときの資料(PDF)をアップしておきます。
ただし、多少(ライセンスと、ソースのURL)を書き加えました。
紹介PDF
また、そのときに紹介したコードを多少変更し、載せておきます。
このコードは、入力されたzipのパスワードが厳密に正しいかをチェックする為のコードです。
ZipFileReader reader = new ZipFileReader();
reader.open(zipFile);
// もっとも小さいファイルを見つける
var list:Array = reader.getEntries();
var targetEntry:ZipEntry = null;
// 実際は、上のlistから何らかの方法で、解凍したいターゲットを選択します。
// チェックサムの値を取得する
var crc32Str:String = targetEntry.getCrc32();
var orgCrc32:Number = parseInt(crc32Str,16);
try{
reader.setPassword("password");
var bytes:ByteArray = reader.unzip(targetEntry);
// ここから下は通常行わなくてよい。
// たまたま、ファイルが解凍できても、その中身を見れば壊れているので、問題ない
bytes.position = 0;
var crc32:uint = ZipCRC32.getByteArrayValue(bytes);
if(crc32 == orgCrc32){
// パスワードが正しい。
}
}
catch(ex:ZipError){
// パスワードが間違っていると、このエラーが起きる
}
また、時間の関係でMS-Officeのファイルを編集までは説明しませんでしたが、
それは私のaixooxというライブラリ(ただし、svnでソースでチェックアウトする必要がある。)を使う方法で、
簡単にある程度は編集できます。
エクセルだけはそれなりに使えるようにはなっているとおもいます。
また、中身はXMLの操作ですから、日本語の問題もありません。
ここから、srcをダウンロードしてください。
http://code.google.com/p/airxoox/
< ?xml version="1.0" encoding="utf-8"?>
<s:windowedapplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="init()"
>
<fx:script>
< ![CDATA[
import com.coltware.airxlib.utils.DateUtils;
import com.coltware.airxoox.airxoox_internal;
import com.coltware.airxoox.classes.OoxML;
import com.coltware.airxoox.core.CoreProps;
import com.coltware.airxoox.excel.SMLCell;
import com.coltware.airxoox.excel.SMLRow;
import mx.logging.ILogger;
private static var log:ILogger = Log.getLogger("airxoox.sample");
import com.coltware.airxoox.SpreadsheetML;
import com.coltware.airxoox.excel.SMLWorkbook;
import com.coltware.airxoox.excel.SMLWorksheet;
import mx.logging.Log;
import mx.logging.LogEventLevel;
import mx.logging.targets.TraceTarget;
private function init():void{
var logTarget:TraceTarget = new TraceTarget();
logTarget.filters = ["com.coltware.airxoox.*","airxoox.*"];
logTarget.level = LogEventLevel.DEBUG;
logTarget.includeCategory = true;
logTarget.includeLevel = true;
logTarget.includeTime = true;
Log.addTarget(logTarget);
}
private function testExcel():void{
var excel:SpreadsheetML = new SpreadsheetML();
excel.openFile(File.desktopDirectory.resolvePath("sample.xlsx"),FileMode.UPDATE);
// プロパティ情報を設定する
var core:CoreProps = excel.getCoreProperties();
core.setKeywords("sample,airxoox");
core.setTitle("this is sample data for airxoox");
core.setDescription("これはあくまでもサンプルです。気をつけてね");
// WORKBOOKを読み込む
var workbook:SMLWorkbook = excel.getWorkbook();
var sheets:Array = workbook.getSheetList();
log.debug("sheet size is .." + sheets.length );
var worksheet:SMLWorksheet = workbook.getSheetAt(0);
// これを忘れてはいけない。データが大きいといけないので使わないsheetは読まない
worksheet.load();
// すべてのデータを取得する
var rowList:Array = worksheet.getRowList();
for each(var row:SMLRow in rowList){
var cells:Array = row.getCellList();
for each(var _cell:SMLCell in cells){
log.debug(_cell.getCellId() + "=>" + _cell.getValue());
}
}
// A1のセルの情報を取得する
var cell:SMLCell = worksheet.getCell("A1");
// そして、そのセルの情報を上書き
cell.setStringValue(ui_a1.text);
// 最後のファイル名を変えて書き込む
excel.saveFile(File.desktopDirectory.resolvePath("output.xlsx"));
excel.closeFile();
}
private function dumpCoreProps(core:CoreProps):void{
log.debug("title=>" + core.getTitle());
log.debug("subject=>" + core.getSubject());
log.debug("creator=>" + core.getCreator());
log.debug("keywords=>" + core.getKeywords());
log.debug("desc=>" + core.getDescription());
log.debug("lastModBy" + core.getLastModifiedBy());
var createdAt:Number = core.getCreatedAt();
if(createdAt){
log.debug("created:" + DateUtils.dateToString("Y/m/d H:i:s",createdAt));
}
}
]]>
</fx:script>
<s:layout>
<s:verticallayout gap="20" />
</s:layout>
<s:textinput width="100" id="ui_a1" />
<s:button label="Excel" click="testExcel()" />
</s:windowedapplication>
ずばり、やりたい事が限定的で明確に決まっているならば、
airxzipとXMLだけで処理をしてしまった方が、わかりやすく、問題も出にくいとは思います。


