「ほっ」と。キャンペーン
タグ:OpenOffice ( 48 ) タグの人気記事
(OpenOffice)Calcでセルの中をコピーしようとするとフリーズする
Windows7環境の OpenOffice3.3 で、Calc使ってるんですが、あるCalcファイルでセルの中の文字列に対しコンテキストメニューを表示してコピー等の操作を使用とすると、以下のようにOpenOfficeが落ちてしまいます。
(他のファイルはなりません)
e0091163_0454144.jpg


エラーの内容を見ると、以下のようになっていました。

問題の署名:
問題イベント名:BEX
アプリケーション名:soffice.bin
アプリケーションのバージョン:3.3.9556.500
アプリケーションのタイムスタンプ:4d061efd
障害モジュールの名前:spellmi.dll
障害モジュールのバージョン:3.3.9556.500
障害モジュールのタイムスタンプ:4f21f2e5
例外オフセット:0001b673
例外コード:c0000409
例外データ:00000000
OS バージョン:6.1.7601.2.1.0.256.48
ロケール ID:1041
追加情報 1:33df
追加情報 2:33df374cff7c82f5a73bc853d1d76b28
追加情報 3:0ac8
追加情報 4:0ac86277dbf5578e8739d3cec49def4e


どうやら、スペルチェックのDLLがクラッシュしているようです。
確かに、セルの中は日本語文字列なんですが、ほとんどの単語でスペルミスを表す赤線が表示されています。

色々調べたとことろ、セルの書式設定→フォント→アジア諸言語用フォント→言語 の値が 空白 でした。
e0091163_0454627.jpg


ここは普通、空白になっていてはいけない項目です。
どうやらファイルが壊れて、空白になっていたようです。
ここを日本語に設定することでスペルミスはなくなり、エラーは発生しなくなりました。
[PR]
by jehoshaphat | 2014-02-10 00:40 | OpenOffice | Trackback | Comments(0)
(OpenOffice)Writerで原稿用紙レイアウトを使う方法
Writerで原稿用紙レイアウトで印刷したいというユーザがいたんで調べてみたら、Going My Way: OpenOffice.org 用 縦書き原稿用紙の作成方法にドンピシャな答えが載ってました。

以下のページ設定でできるようです。

メニューバー

書式

・ページ タブ
  配置:横
  文字の方向:右から左へ(縦書き)
・行数と文字数 タブ
  行数と文字数を指定する にチェック
  ページ単位の行数:20
  行単位の文字数:20
  罫線を表示する:チェック
  罫線を印刷する:チェック
  罫線の色:任意

[PR]
by jehoshaphat | 2014-01-31 00:01 | OpenOffice | Trackback | Comments(0)
Microsoft UpdateでWord/Excelビューアのパッチ当てたら関連付けを勝手に変更された
ターミナルサーバで、メインのOffice suiteとしてOpenOfficeを使用してます。
が、なぜか Word/Excelビューアも入ってます。
doc,xlsファイルの関連付けはOpenOfficeに設定しているのですが、WindowsUpdateでWord/Excelビューアのセキュリティパッチを当てたら、勝手に全ユーザの関連付けを変更しやがりました。
doc,xlsファイルをビューアーで開くようにされてしまったのです。
(ユーザが個別に設定して場合は影響有りませんでした)


フォルダオプションで設定してもいいのですが、ユーザ単位の設定となってしまっては面倒なので、レジストリを直接触ることにしました。


で、参考にさせてもらったのが、Windows の関連づけ設定の仕組みです。
これを見ると、ユーザごとの関連付け(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\)が最優先で動くようです。

今回、パッチによって変更されていたのは HKEY_CLASSES_ROOT\* (Basic Class Key)でした。
(ちなみに、HKEY_CLASSES_ROOT は HKEY_LOCAL_MACHINE\Software のサブキーです。)

ビューアで開く関連付けファイルだと以下のようになってました。
(エキサイトブログのダメ仕様上一部.の前に半角スペースを置いています。実際は半角スペースを.の前の半角スペースを削除してください)

HKEY_CLASSES_ROOT\.doc
(既定)=Wordview.Document .8
"Content Type"="application/msword"

HKEY_CLASSES_ROOT\.xls
(既定)=ExcelViewer.Sheet.8

HKEY_CLASSES_ROOT\.docx
(既定)="Word.Document .12"
"Content Type"="application/vnd.openxmlformats-officedocument .wordprocessingml.document"


HKEY_CLASSES_ROOT\.pptx
(既定)="PowerPointViewer.Show.12"


これを以下のように修正したら、全ユーザでOpenOfficeで開くようになりました。(個別設定しているユーザ以外)

HKEY_CLASSES_ROOT\.doc
(既定)=OpenOffice.org.Doc
削除 → "Content Type"="application/msword"

HKEY_CLASSES_ROOT\.xls
(既定)=OpenOffice.org.Xls

HKEY_CLASSES_ROOT\.docx
(既定)=OpenOffice.org.Docx
削除" → "Content Type"="application/vnd.openxmlformats-officedocument .wordprocessingml.document"

HKEY_CLASSES_ROOT\.xlsx
(既定)=OpenOffice.org.Xlsx

HKEY_CLASSES_ROOT\.pptx
(既定)="OpenOffice.org.Pptx"


この(既定)の値は、ProgID Key というものらしく、HKEY_CLASSES_ROOT\OpenOffice.org.Doc にアイコンや実際の動作の挙動が書いているようです。


関連付けは結構厄介ですね。

参考:
OKWave:ファイルの「関連付け変更」は、どこに記録されるの?
[PR]
by Jehoshaphat | 2013-03-29 22:45 | 豆知識 | Trackback | Comments(0)
OpenOffice3.3はWindows7でmsiインストールしようとするとダメっぽい
OpenOfficeをActiveDirectoryで展開するの前半で、グループポリシーの[ソフトウェア]インストール機能を使ってOpenOfficeを展開する方法を書きました。

今回Windowsドメイン内にWindows7の端末が参加するということで、最新版である OpenOffice3.3 をグループポリシーの[ソフトウェア]インストール機能で展開しようと試みました。

しかし、どうもうまく行きません。

試しに、MSIファイルをWindows7上で実行すると、 setup.exeを使用してインストールを開始してください。 と怒られます。

なので、Windows7の端末でサイレントインストールするには、バッチで以下のようにやるしか無いようです。

setup.exe /qn

[PR]
by Jehoshaphat | 2013-03-27 22:39 | OpenOffice | Trackback | Comments(0)
.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part3)
.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)の続きで、Part3です。(C#)



#region 各プロパティ設定デリゲートメソッド
/// <summary>文字色を設定する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void SetCharColorDelegate(PropertiesDelegateParam prm)
prm.XPropertySet.setPropertyValue("CharColor", new uno.Any(ConvertOooColorFromDotNetColor(prm.ColorValue)));
}
/// <summary>セル背景色を設定する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void SetCellBackColorDelegate(PropertiesDelegateParam prm) {
//下記の形式だとNGみたい
//prm.XPropertySet.setPropertyValue("CellBackColor", new uno.Any(ColorTranslator.ToWin32(prm.ColorValue)));
prm.XPropertySet.setPropertyValue("CellBackColor", new uno.Any(ConvertOooColorFromDotNetColor(prm.ColorValue)));
}
/// <summary> セル文字の大きさを設定する。(デリゲート経由で呼び出される</summary>)
/// <param name="prm"></param>
private void SetCharHeightDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue("CharHeight", new uno.Any(prm.FloatValue ));
}
/// <summary> セル枠までのスペースを設定する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void SetParagraphDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue(GetParagraphName(prm.SideValue), new uno.Any(prm.IntValue));
}
/// <summary>背景色を透過設定する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void SetIsCellBackgroundTransparentDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue("IsCellBackgroundTransparent", new uno.Any(prm.BoolValue));
}

/// <summary>文字色を取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetCharColorDelegate(PropertiesDelegateParam prm) {
prm.ColorValue = Color.FromArgb((int)(prm.XPropertySet.getPropertyValue("CharColor").Value));
}
/// <summary> セル背景色を取得する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void GetCellBackColorDelegate(PropertiesDelegateParam prm) {
//下記の形式だとNGみたい
//prm.ColorValue = ColorTranslator.FromWin32((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
//prm.ColorValue = Color.FromArgb((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
prm.ColorValue = ConvertDotNetColorFromOooColor((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
}
/// <summary> セル文字の大きさを取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetCharHeightDelegate(PropertiesDelegateParam prm){
prm.FloatValue = (float)(prm.XPropertySet.getPropertyValue("CharHeight").Value);
}
/// <summary>セル枠までのスペースを取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetParagraphDelegate(PropertiesDelegateParam prm){
prm.IntValue = (int)(prm.XPropertySet.getPropertyValue(GetParagraphName(prm.SideValue)).Value);
}
/// <summary> 背景色を透過設定を取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetIsCellBackgroundTransparentDelegate(PropertiesDelegateParam prm){
prm.BoolValue = (bool)(prm.XPropertySet.getPropertyValue("IsCellBackgroundTransparent").Value);
}

/// <summary>パディング名を取得 </summary>
/// <param name="side"></param>
/// <returns></returns>
private string GetParagraphName(ParagraphSide side){
string strPropName = "";
switch (side) {
case ParagraphSide.Left:
strPropName = "ParaLeftMargin";
break;
case ParagraphSide.Right:
strPropName = "ParaRighttMargin";
break;
case ParagraphSide.Top:
strPropName = "ParaTopMargin";
break;
case ParagraphSide.Bottom:
strPropName = "ParaBottomMargin";
break;
default:
break;
}
return strPropName;
}

/// <summary> カラー情報をOpenOfficeで扱える形式に変換</summary>
private int ConvertOooColorFromDotNetColor(Color color) {
return (int)((int)color.R * Math.Pow(2, 16)
+ (int)color.G * Math.Pow(2, 8)
+ (int)color.B);
}
/// <summary>OpenOfficeのカラー情報を.Netの Color に変換</summary>
private Color ConvertDotNetColorFromOooColor(int iClr)
{
if (iClr < 0)
return Color.Transparent;//-1時は透明とみなす
return Color.FromArgb(iClr >> 16 , (iClr >> 8) & 0xFF, iClr & 0xFF );
}
#endregion

/// <summary> シートが選択されていないなら例外発生 </summary>
private void IsSheetNullCheckException(){
if (!IsSheetNullCheck()){
throw new OpenOfficeException("OpenOffice操作クラス例外:sheetが選択されていません。");
}
}
/// <summary>セルが選択されていないなら例外発生 </summary>
private void IsCellNullCheckException(){
if (!IsCellNullCheck()){
throw new OpenOfficeException("OpenOffice操作クラス例外:cellが選択されていません。");
}
}

#region IDisposable メンバ
/// <summary>クラス破棄時</summary>
public void Dispose(){
//OpenOffice閉じる
OpenOfficeClose();
//OpenOfficeのプロセス強制終了
OpenOfficeProcessKill();
}
#endregion
}

/// <summary>プロパティ設定・取得のための値を持つクラス。
/// Actionデリゲートでつかうるようにするため各型のを扱えるようにラップしたもの。 </summary>
class PropertiesDelegateParam{
private XPropertySet xPropSet;
private Color clrValue;
private double dValue;
private float fValue;
private int iValue;
private long lValue;
private string strValue;
private bool blValue;
private OpenOffice.ParagraphSide sideValue;
/// <summary>コンストラクタ。</summary>
/// <param name="xPropertySet">(XPropertySet)this.cell</param>
protected internal PropertiesDelegateParam(XPropertySet xPropertySet){
xPropSet = xPropertySet;
}
/// <summary>プロパティでカラー情報を設定・取得</summary>
protected internal Color ColorValue{
get { return clrValue; }
set { clrValue = value; }
}
/// <summary>プロパティで倍精度小数点を設定・取得</summary>
protected internal double DoubleValue{
get { return dValue; }
set { dValue = value; }
}
/// <summary>プロパティで単精度小数点を設定・取得</summary>
protected internal float FloatValue{
get { return fValue; }
set { fValue = value; }
}
/// <summary>プロパティで整数を設定・取得</summary>
protected internal int IntValue{
get { return iValue; }
set { iValue = value; }
}
/// <summary> プロパティで長整数を設定・取得 </summary>
protected internal long LongValue{
get { return lValue; }
set { lValue = value; }
}
/// <summary>プロパティで文字列を設定・取得</summary>
protected internal string StringValue{
get { return strValue; }
set { strValue = value; }
}
/// <summary>プロパティで真偽を設定・取得</summary>
protected internal bool BoolValue{
get { return blValue; }
set { blValue = value; }
}
/// <summary>プロパティで方向を設定・取得</summary>
protected internal OpenOffice.ParagraphSide SideValue{
get { return sideValue; }
set { sideValue = value; }
}
/// <summary>XPropertySetオブジェクトを取得</summary>
protected internal XPropertySet XPropertySet{
get { return xPropSet; }
}
}

/// <summary>このクラスの例外</summary>
class OpenOfficeException : System.Exception{
public OpenOfficeException(string message)
: base(message){
}
}
}

[PR]
by Jehoshaphat | 2011-10-20 02:29 | .Net開発 | Trackback | Comments(0)
NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)
.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part1)の続きで、Part2です。(C#)



/// <summary>セル背景色を取得(先にSelectCellでセル指定が必要)</summary>
/// <returns>取得した文字色</returns>
public Color GetCellBackColorr() {
Action<PropertiesDelegateParam> getPropParam = GetCellBackColorDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
GetCoreProperties(getPropParam, prm);
return prm.ColorValue;
}
/// <summary>文字サイズを設定(先にSelectCellでセル指定が必要) </summary>
/// <param name="fSize">設定するサイズ</param>
public void SetCharHeight(float fSize) {
Action<PropertiesDelegateParam> setPropParam = SetCharHeightDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.FloatValue = fSize;
SetCoreProperties(setPropParam, prm);
}
/// <summary> 文字サイズを取得(先にSelectCellでセル指定が必要)</summary>
/// <returns>取得した文字サイズ</returns>
public float GetCharHeight() {
Action<PropertiesDelegateParam> getPropParam = GetCharHeightDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
GetCoreProperties(getPropParam, prm);
return prm.FloatValue;
}
/// <summary>パディングサイズを設定(先にSelectCellでセル指定が必要) </summary>
public void SetParagraph(int iValue,ParagraphSide side) {
Action<PropertiesDelegateParam> setPropParam = SetCharHeightDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.SideValue = side;
SetCoreProperties(setPropParam, prm);
}
/// <summary>パディングサイズを取得(先にSelectCellでセル指定が必要) </summary>
public int GetParagraph(ParagraphSide side) {
Action<PropertiesDelegateParam> getPropParam = GetParagraphDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.SideValue = side;
GetCoreProperties(getPropParam, prm);
return prm.IntValue;
}
/// <summary> 背景色を透過設定(先にSelectCellでセル指定が必要) </summary>
public void SetIsCellBackgroundTransparent(bool bTrans){
Action<PropertiesDelegateParam> setPropParam = SetIsCellBackgroundTransparentDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.BoolValue = bTrans;
SetCoreProperties(setPropParam, prm);
}
/// <summary>文字サイズを取得(先にSelectCellでセル指定が必要)</summary>
/// <returns>取得した文字サイズ</returns>
public bool GetIsCellBackgroundTransparent() {
Action<PropertiesDelegateParam> getPropParam = GetIsCellBackgroundTransparentDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
GetCoreProperties(getPropParam, prm);
return prm.BoolValue;
}

/// <summary> 行を挿入する</summary>
/// <param name="startRow">挿入開始行インデックス</param>
/// <param name="endRow">挿入する行の数</param>
public void InsertRowByIndex(int startRow, int insertRowsCount){
XColumnRowRange xCRRange = (XColumnRowRange)sheet;
XTableRows xRows = xCRRange.getRows();
xRows.insertByIndex(startRow, insertRowsCount);
}
/// <summary>指定した行を削除する </summary>
/// <param name="startRow">削除開始行インデックス</param>
/// <param name="endRos">削除する行の数</param>
public void RemoveRowByIndex(int startRow, int removeRowsCount){
XColumnRowRange xCRRange = (XColumnRowRange)sheet;
XTableRows xRows = xCRRange.getRows();
xRows.removeByIndex(startRow, removeRowsCount);
}

/// <summary> OpenOfficeのファイルを保存 </summary>
public void OpenOfficeSave() {
try{
//保存するために使うクラス(インターフェイス?)取得
XStorable xstorable = (XStorable)doc;
//保存時のプロパティ設定
PropertyValue[] storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "Overwrite"; //上書き
storeProps[0].Value = new uno.Any((Boolean)true);
String sURL = strUriFilePath;
//保存
xstorable.storeAsURL(sURL, storeProps);
}catch (System.Exception ex){
OpenOfficeProcessKill();
throw;
}
}

/// <summary>OpenOfficeのファイルを上書保存し、閉じる(プロセスも殺す) </summary>
public void OpenOfficeSaveAndClose(){
//保存するために使うクラス(インターフェイス?)取得
XStorable xstorable = (XStorable)doc;
//保存時のプロパティ設定
PropertyValue[] storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "Overwrite"; //上書き
storeProps[0].Value = new uno.Any((Boolean)true);
try{
String sURL = strUriFilePath;
//保存
xstorable.storeAsURL(sURL, storeProps);
//閉じる
OpenOfficeClose();
}catch (unoidl.com.sun.star.uno.Exception ex){
throw;
}finally{
//OpenOfficeのプロセス強制終了
OpenOfficeProcessKill();
}
}

/// <summary>OpenOfficeを閉じる(プロセスは殺さない) </summary>
public void OpenOfficeClose(){
if (doc != null){
XCloseable xCloseable = (XCloseable)doc;
xCloseable.close(true);
doc = null;
factory = null;
loader = null;
context = null;
}
}

/// <summary> OpenOfficeのプロセス強制終了をする。 </summary>
public static void OpenOfficeProcessKill() {
try{
//現在のユーザ名取得
string strUserName = Environment.UserName;
//open office のプロセス検索。
Process[] ps = Process.GetProcessesByName("soffice.bin");
//WMIからOpenOfficeのプロセス取得
ManagementObjectSearcher query = new ManagementObjectSearcher(@"SELECT * FROM Win32_Process Where Name = 'soffice.bin'");
ManagementObjectCollection col = query.Get();
//配列から1つずつ取り出す
foreach (System.Diagnostics.Process p in ps){
//現在のユーザ名とプロセスの実行ユーザ名が同じなら殺す
foreach (ManagementObject o in col){
int pId = int.Parse(o["ProcessId"].ToString());
Object[] UserInfo = new object[2];
o.InvokeMethod("GetOwner", UserInfo);
if (p.Id == pId && strUserName.Equals((string)UserInfo[0])){
p.Kill();
break;
}
}
}
} catch {
//プロセス強制終了時のエラーは無視
}
}

/// <summary>シートが選択されているかどうか</summary>
/// <returns></returns>
public bool IsSheetNullCheck(){
return (this.sheet == null ? false: true);
}
/// <summary> セルが選択されているかどうか</summary>
/// <returns></returns>
public bool IsCellNullCheck(){
return (this.cell == null ? false : true);
}

#region 汎用メソッド
/// <summary> プロパティをセットする汎用メソッド(共通部分のみ記述。実際の処理はデリゲートに任せる) </summary>
/// <param name="setPropParam">デリゲート変数</param>
/// <param name="prm">プロパティに設定する値クラス(各型を持っただけのエンティティクラス)</param>
private void SetCoreProperties(Action<PropertiesDelegateParam> setPropParam, PropertiesDelegateParam prm){
try {
IsSheetNullCheckException();
IsCellNullCheckException();
//デリゲート呼び出し
setPropParam(prm);
} catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}
/// <summary> プロパティを取得する汎用メソッド(共通部分のみ記述。実際の処理はデリゲートに任せる) </summary>
/// <param name="getPropParam">デリゲート変数</param>
/// <param name="prm">プロパティに取得値をもつ値クラス(各型を持っただけのエンティティクラス)</param>
private void GetCoreProperties(Action<PropertiesDelegateParam> getPropParam, PropertiesDelegateParam prm){
try{
IsSheetNullCheckException();
IsCellNullCheckException();
//デリゲート呼び出し
getPropParam(prm);
}catch (System.Exception ex){
OpenOfficeProcessKill();
throw;
}
}
#endregion


続きは、.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part3)へ。
[PR]
by Jehoshaphat | 2011-10-20 02:27 | .Net開発 | Trackback | Comments(0)
NetからOpenOfficeCalcへの操作を汎用化したDLL(Part1)
.NetからOpenOfficeCalcへの操作を汎用化したDLLのPart1です。(C#)



using System;
using System.Collections.Generic;
using System.Text;
using uno.util;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.sheet;
using unoidl.com.sun.star.table;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.util;
using unoidl.com.sun.star.text;
using System.Management;
using System.Diagnostics;
using unoidl.com.sun.star.container;
using System.Drawing;
namespace OpenOfficeAccessRapper{
public class OpenOfficeRapper : IDisposable{
private XComponentContext context;
private XMultiServiceFactory factory;
private XComponentLoader loader;
private XSpreadsheetDocument doc;
private XSpreadsheets sheets;
private XSpreadsheet sheet;
private XCell cell;
private XCellRange xCellRange;
private string strUriFilePath;
public XCell Cell{
get { return cell; }
}
/// <summary>各方向を表す列挙型</summary>
public enum ParagraphSide{
Left, Right, Top, Bottom
}

/// <summary>コンストラクタ</summary>
/// <param name="calcFileName">Calcのファイル名</param>
public OpenOffice( string calcFileName ) {
//ファイルパスを変換
Uri uriCalcFile;
Uri.TryCreate(calcFileName, UriKind.Absolute, out uriCalcFile);
strUriFilePath = uriCalcFile.ToString();
//コンポーネントコンテキストオブジェクト取得(OpenOfficeの基本プロセスらしい)
context = Bootstrap.bootstrap();
//サービスマネージャ取得
factory = (XMultiServiceFactory)context.getServiceManager();
//コンポーネントローダオブジェクト取得
loader = (XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop");
//非表示で実行するためのプロパティ指定
PropertyValue[] args1 = new PropertyValue[1];
args1[0] = new PropertyValue();
args1[0].Name = "Hidden";
args1[0].Value = new uno.Any((Boolean)true);
//ファイルを開きドキュメントオブジェクトを生成
doc = (XSpreadsheetDocument)loader.loadComponentFromURL(strUriFilePath, "_blank", 0, args1);// null);
//シートたちを取得
sheets = doc.getSheets();
}

/// <summary>シートを選択する(選択したシートはメンバ変数に保持) </summary>
/// <param name="sheetName">シート名</param>
public void SelectSheet(string sheetName) {
try {
this.sheet = (XSpreadsheet)this.sheets.getByName(sheetName).Value;
} catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}

/// <summary> 現在アクティブなシートで指定したセルを選択。選択したセルはメンバ変数に持つ。</summary>
public void SelectCell(int iColumn, int iRow) {
try {
IsSheetNullCheckException();
this.cell = this.sheet.getCellByPosition(iColumn, iRow);
} catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}

/// <summary>指定されたセル範囲を選択(選択したセル範囲はメンバ変数に保持)</summary>
public void SelectRangeByPosition(int nLeft, int nTop, int nRight, int nBottom){
try {
IsSheetNullCheckException();
xCellRange = sheet.getCellRangeByPosition(nLeft, nTop, nRight, nBottom);
} catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}

/// <summary>選択したセル範囲に罫線を引く(先にSelectRangeByPositionでセル範囲指定が必要) </summary>
public void Border(int color) {
XPropertySet xPropSet = (XPropertySet)xCellRange;
BorderLine aLine = new BorderLine();
aLine.Color = color;
aLine.InnerLineWidth = aLine.LineDistance = 0;
aLine.OuterLineWidth = 10;
TableBorder aBorder = new TableBorder();
aBorder.TopLine = aBorder.BottomLine = aBorder.LeftLine = aBorder.RightLine = aLine;
aBorder.IsTopLineValid = aBorder.IsBottomLineValid = true;
aBorder.IsLeftLineValid = aBorder.IsRightLineValid = true;
aBorder.IsVerticalLineValid = true;
aBorder.IsHorizontalLineValid = true;
aBorder.HorizontalLine = aBorder.VerticalLine = aLine;
xPropSet.setPropertyValue("TableBorder", new uno.Any(typeof(unoidl.com.sun.star.table.TableBorder), aBorder));
}

/// <summary>現在選択しているセルに数値を代入(先にSelectCellでセル指定が必要) </summary>
public void SetCellValue(double value) {
try {
IsSheetNullCheckException();
IsCellNullCheckException();
this.cell.setValue(value);
} catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}

/// <summary>現在選択しているセルの数値を取得(先にSelectCellでセル指定が必要)</summary>
public double GetCellValue() {
double d ;
try {
IsSheetNullCheckException();
IsCellNullCheckException();
d = this.cell.getValue();
}catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
return this.cell.getValue();
}

/// <summary>現在選択しているセルに数式を代入(先にSelectCellでセル指定が必要)</summary>
public void SetCellFormula(string value) {
try{
IsSheetNullCheckException();
IsCellNullCheckException();
this.cell.setFormula(value);
}catch (System.Exception ex) {
OpenOfficeProcessKill();
throw;
}
}

/// <summary>現在選択しているセルの数式を取得(先にSelectCellでセル指定が必要) </summary>
public string GetCellFormula(){
string str = string.Empty;
try{
IsSheetNullCheckException();
IsCellNullCheckException();
str=this.cell.getFormula();
}catch (System.Exception ex){
OpenOfficeProcessKill();
throw;
}
return str;
}


/// <summary> 現在選択しているセルの文字列を取得(先にSelectCellでセル指定が必要)</summary>
public string GetCellString() {
string str = string.Empty;
try {
IsSheetNullCheckException();
IsCellNullCheckException();
XText txt = (XText)this.cell;
str = txt.getString();
}catch (System.Exception ex){
OpenOfficeProcessKill();
throw;
}
return str;
}

/// <summary>セル文字色を設定(先にSelectCellでセル指定が必要) </summary>
/// <param name="CharColor">設定するカラー構造体</param>
public void SetCharColor(Color CharColor) {
Action<PropertiesDelegateParam> setPropParam = SetCharColorDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.ColorValue = CharColor;
SetCoreProperties(setPropParam,prm);
}
/// <summary>セル文字色を取得(先にSelectCellでセル指定が必要) </summary>
/// <returns>取得した文字色</returns>
public Color GetCharColor() {
Action<PropertiesDelegateParam> getPropParam = GetCharColorDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
GetCoreProperties(getPropParam, prm);
return prm.ColorValue;
}
/// <summary> セル背景色を設定(先にSelectCellでセル指定が必要)</summary>
/// <param name="CharColor">設定するカラー構造体</param>
public void SetCellBackColor(Color CharColor){
Action<PropertiesDelegateParam> setPropParam = SetCellBackColorDelegate;
PropertiesDelegateParam prm = new PropertiesDelegateParam((XPropertySet)this.cell);
prm.ColorValue = CharColor;
SetCoreProperties(setPropParam, prm);
}



続きは、.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)へ。
[PR]
by Jehoshaphat | 2011-10-20 02:23 | .Net開発 | Trackback | Comments(0)
(.Net,OpenOffice).NetからCalc操作時にセルのプロパティを変更する
.NetからOpenOfficeのCalcを操作する基本の方法は、(.Net,OpenOffice).NetからCalc操作時に罫線(枠線)を引くが参考になります。

今回は、セルの文字色、背景色、文字の大きさ、セル枠までのスペース(パディング)を変更する方法です。

サンプルは、OpenOffice.org_3.2_SDK\sdk\examples\CLI\CSharp\Spreadsheet\SpreadsheetDocHelper.cs の prepareRange メソッドに書いてあります。
サンプルでは下記のようになっています。

// --- Change cell properties. ---
xPropSet = (unoidl.com.sun.star.beans.XPropertySet) xCell;
// from styles.CharacterProperties
xPropSet.setPropertyValue(
"CharColor", new uno.Any( (Int32) 0x003399 ) );
xPropSet.setPropertyValue(
"CharHeight", new uno.Any( (Single) 20.0 ) );
// from styles.ParagraphProperties
xPropSet.setPropertyValue(
"ParaLeftMargin", new uno.Any( (Int32) 500 ) );
// from table.CellProperties
xPropSet.setPropertyValue(
"IsCellBackgroundTransparent", new uno.Any( false ) );
xPropSet.setPropertyValue(
"CellBackColor", new uno.Any( (Int32) 0x99CCFF ) );


ハマったのは色の設定です。
.Net の Color構造体をそのまま使おうとしたのですが、アルファ値を含むので使えません。
ColorTranslator.ToWin32 メソッドを使ってアルファ値を含まないInt32型の値を使おうとしましたが、どうも違う色になってしまいます。
ColorTranslator.ToWin32 メソッドの返り値で表すカラー情報はCOLORREF型という4バイトの符合なし整数のようで、内部的には 0x00BBGGRR で色を表しているようです。
OpenOfficeのプロパティに設定すべきなのは 0xRRGGBB になるので、違う色になってしまうのですね。

結局色に関して、Color構造体を 0xRRGGBB に変換するときは Rに2^16したもの + Gに2^8したもの + B としました。
逆に 0xRRGGBB から Color構造体を作るときは、Rは16ビット右シフト,Gは8ビット右シフト,Bはそのまま の値で Color.FromArgb メソッドから生成することにしました。

さて、OpenOfficeCalcへの操作をいちいちソース内に書くのは面倒です。
ということで、OpenOfficeCalcへの操作を汎用化したDLLを作成してます。まだ未完成なので問題があるかと思いますが、今回のセルプロパティの部分も含めて載せてみたいと思います。


以前に書いた罫線へのアクセスやセルへのアクセス、デリゲートを使った部分も入っています。(C# .NetFramework2.0)
文字数制限のため、ハイライト無し&&分割して掲載します。
NetからOpenOfficeCalcへの操作を汎用化したDLL(Part1)
NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)
NetからOpenOfficeCalcへの操作を汎用化したDLL(Part3)


参考:
●Win32API(C言語)編 第13章 色の指定
Service CellProperties
[PR]
by Jehoshaphat | 2011-10-20 02:02 | .Net開発 | Trackback | Comments(0)
(OpenOfficeBasic)印刷プレビューかどうかを判断する
OpenOffice3.2のマクロ(Basic)で、現在のビューが印刷プレビューかどうかを判断する方法です。
自力では難しそうだったので、ググったら OOobbs2/142 でどんぴしゃな方法が載っていました。

100%コピペなコードですが、転載させてもらいます。

Function IsPrintPreview( oDoc ) As Boolean
Dim bPreview As Boolean
sViewInterface = ""
oModMgr = CreateUnoService( _
"com.sun.star.frame.ModuleManager")
sModule = oModMgr.identify(oDoc)

Select Case sModule
Case "com.sun.star.text.TextDocument"
sViewInterface = "com.sun.star.view.XViewSettingsSupplier"
Case "com.sun.star.sheet.SpreadsheetDocument"
sViewInterface = "com.sun.star.sheet.XSpreadsheetView"
Case Else
sViewInterface = ""
End Select

If sViewInterface <> "" Then
oController = oDoc.getCurrentController()
bPreview = NOT HasUnoInterfaces(oController, sViewInterface)
End If

IsPrintPreview = bPreview
End Function

この関数の引数に、ThisComponent を渡すと、印刷プレビューかどうかが true,false で返ってくるので、これで判別できます。
[PR]
by jehoshaphat | 2011-07-10 23:13 | OpenOffice | Trackback | Comments(0)
(OpenOffice)メニューバーのフォントが汚い
WindowsXPでOpenOffice3.2を使ってますが、OpenOfficeのメニューバーのフォントが小さくつぶれた用に汚く見える現象が出ています。

下記のような感じです。
e0091163_22571791.jpg

で、調べると解決策として、Windowsの画面のプロパティから、フォントを設定する方法(デザインの詳細で、メニューのフォントをTahomaからMS UI Goshicにする)と、OpenOfficeの設定でフォントを置換する方法とがありました。

Windowsのデザインは変えたくなかったので、後者の方法を試してみました。

OpenOfficeのメニューバーの ツール → オプション → OpenOffice.org → フォント で、置換テーブルを使用 にチェックを入れ、Tahoma を MS UI Goshic に置換するようにし、リスト追加後 常に にチェックを入れて、OKを押下します。

しかし、見やすい MS UI Goshic にはなったのですが、今度は下記のように小さすぎてつぶれており、やはり見やすくありません。
e0091163_22573686.jpg


Windowsの画面のプロパティ デザインの詳細で、メニューのフォントサイズを8ptから9ptにすれば、きれいに見えるのですが、今度はスタートメニューの英字等が一回り大きくなり個人的に気に入りません。


で、いろいろ試した結果、置換テーブルで MS UI Goshicにした後、OpenOfficeのメニューバーの ツール → オプション → OpenOffice.org → 表示 で、ユーザインタフェースの倍率を 110% にするとWindowsのデザイン設定変更しなくても下記のようにいい感じになりました。
e0091163_22575981.jpg


本来は、Windowsデザインの設定でTahoma 8pt にしてても、WindowsServer2003R2でフォントが小さく見ずらい所があるで書いたように、日本語の場合はシステムフォントが使われるはずなんですが、どうもOpenOfficeはそうじゃないようです。。。
UIって大事ですね。

参考:
OpenOfficeのメニューフォントの変更方法 Windowsのデザインからフォントを設定する方法ですね。
OpenOfficeのフォントが汚い 置換テーブルを使ってフォントを変更する方法です。
[PR]
by jehoshaphat | 2011-07-10 23:05 | OpenOffice | Trackback | Comments(0)