忙しい現代人の腰&肩のお悩み対策!

ひらがな、カタカナは読み込めるのですが、漢字で下記のエラーが出ます。
mb_convert_encodingでいろいろ変換してみましたがダメです。
教えてください!

Fatal error: Uncaught exception 'Exception' with message 'Could not open 予?xls for reading! File does not exist, or it is not readable.' in C:\xampp\htdocs\Partner_Management\PHPExcel\Shared\OLERead.php:76 Stack trace: #0 C:\xampp\htdocs\Partner_Management\PHPExcel\Reader\Excel5.php(928): PHPExcel_Shared_OLERead->read('??????xls') #1 C:\xampp\htdocs\Partner_Management\PHPExcel\Reader\Excel5.php(498): PHPExcel_Reader_Excel5->_loadOLE('??????xls') #2 C:\xampp\htdocs\Partner_Management\EstimateCost.php(54): PHPExcel_Reader_Excel5->load('??????xls') #3 {main} thrown in C:\xampp\htdocs\Partner_Management\PHPExcel\Shared\OLERead.php on line 76

ファイル名:予定.xls

OS:WindowsXP
Excel:Excel5
XAMPP:1.7.3

[php.ini]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = SJIS
mbstring.encoding_translation = Off
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII
mbstring.substitute_character = none;
mbstring.script_encoding= Shift_JIS

[phpファイルの文字コード]
UTF-8

このQ&Aに関連する最新のQ&A

A 回答 (3件)

mbstring.language = Japanese


mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = SJIS
mbstring.encoding_translation = Off
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII
mbstring.substitute_character = none;
mbstring.script_encoding= Shift_JIS

すみません、これらをよくみると、
mbstring.http_output = SJIS
ってなっているということは、画面が遷移して、ページがレンダリングされるたびに、
すべての出力がSJISになります。
にもかかわらず、
mbstring.http_input = pass
となっているので、POSTされて受け取った値はすべてSJISで渡されてきてしまうと思います。

これは、両方共「pass」にしたほうが良いです。
また、mbstring.script_encodingにかんしても、ドキュメントがなかったりして何をやっているかよくわからないので
出来ればコメントアウトしてしまうのが無難かなと。
※私の場合は、mbstring関連の項目はすべてデフォルトのままです(つまり全部コメントアウト)。
基本的に自分の書いているスクリプトで各エンコーディングを行ったほうが、別の環境で実行した場合でも問題が起こりづらい。



それらを設定した上、一度XAMPPを再起動させてみて、現象が発生するか確認されたほうが良いと思います。

HTMLがSJISで記述されているなら、echoする出力全てに、mb_convert_encodingしないといけないですが。

まぁ、逆に言えば今の設定のままでも、読み込むファイル名がPOSTされた値なのであれば、mb_convert_encodingをしなければ読めそうな気がします。
    • good
    • 0
この回答へのお礼

php.iniのmbstring関連の項目をすべてコメントアウトしました。
これでもダメだったのですが、OLERead.phpのread()メソッドのis_readableをコメントアウトすると、読み込めるようになりました。

is_readableのコメントアウトだけでは読み込めなかったのでとりあえず解決はしました。
ありがとうございました。

お礼日時:2010/12/14 10:22

mb_convert_encoding($filename, 'SJIS','CP932');


ここの記述ですが、「CP932」って、SJISのことですよ。

phpファイルをUTF-8で記述しているなら、

mb_convert_encoding($filename, 'SJIS-win', 'UTF-8');

ではないですか。

この回答への補足

mb_convert_encoding($filename, 'SJIS-win', 'UTF-8');
は試してみました。
が、これだと平仮名、カナカナのファイルすら読み込めなくなってしまいます。

mb_convert_encoding($filename, 'SJIS','CP932');
ですと、平仮名、カタカナを読み込めるようになります。

一体何なのでしょうか。。

もしかしてWindowsXP(Excel97-2003)だと読み込めないのでは?
という気がしているのですが。
家のWindows7(Excel2007のExcel97-2003)では漢字ファイルを読み込めます。

補足日時:2010/12/10 01:13
    • good
    • 0

これの場合「予定」以外のファイルはどうでしょうか?



有名な話shiftjisの「予」は975Cのため5C問題にひっかかります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
5C問題は知りませんでした。

ただ、「予」を避けても変わりませんでした。

ソースコードはこちらです。

--------------------------------------------
set_include_path(get_include_path() . PATH_SEPARATOR . './PHPExcel/Classes/');
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';
require_once 'MySQL.php';

$objReader = PHPExcel_IOFactory::createReader('Excel5');

$filename = "進行.xls";
$filename = mb_convert_encoding($filename, 'SJIS','CP932');

$objPHPExcel = $objReader->load($filename);
-------------------------------------------------

お礼日時:2010/12/09 17:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Q【file_exists】ファイルが存在するのに、存在しないとなります

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_existsでファイルが存在するか確認してから(2)に移ろうとお思いました。
が、ファイル名は全部ないといわれてしまうのです。
しかしfile_exists($filename)の$filenameを表示させ、ブラウザにこぴぺするとtextデータは出てきます。

以下プログラムの一部です
※$cは(1)で得たフォルダ内にあるファイル名をループでまわしている値です

for($b=0;$b<$a;$b++){
 $filename="C:/Inetpub/wwwroot/php/kore/1/".$c;
if (file_exists($filename)) {
print "あるよ<BR>";
} else {
print "ないよ<BR>";
}
}

結果は(一部です)
C:/Inetpub/wwwroot/php/kore/1/.text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/..text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt⇒ないよ
です。
上記の
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt
は確実に存在しております。

どこがおかしいのか、ご教授いただければ幸いです
よろしくお願いいたします

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_exists...続きを読む

Aベストアンサー

直接の回答ではありませんが、「.」や「..」という名前が出て来るということは、scandirやopendirしてreaddirでファイル名の一覧を取得しているということですよね。

一覧すべてを取得するのではなく、目的とするファイルのみ一覧で取得できるglobを使う方が便利ではないかと思います。たとえば glob("*.txt") を実行すれば、拡張子がtxtのファイルの一覧を返してくれます。

file_existsがtrueで返らない理由については、他の方もおっしゃっているとおり、まず渡しているファイル名が本当に思っているものなのかどうかを確認してみた方が良いと思います。ありそうなのは、$c にディレクトリ名の一部が入っている、とか。

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

QPHPExcel使用で2枚目のシートを作る方法

閲覧ありがとうございます。
さっそく質問なのですが、私は現在PHPExcelを使用しています。
このクラスを利用してExcelのファイル形式に出力することはできるようになりました。
しかし、シートを1枚しか使う事ができません。
2枚目、3枚目と、シートを作る方法を教えて頂きたいです。
使用環境はxamppです。
よろしくお願いします!

Aベストアンサー

今日まで、実際にPHPExcelを使ったことがないのでアレなんですが、
http://journal.mycom.co.jp/articles/2009/03/06/phpexcel/index.html
こちら(マイコミジャーナル)の記事を見る限りでは、
PHPExcelをnewした時点で一枚目のシートは自動的に生成されるようです。
(実際にスクリプトコピペして試してみたところ正しく動作しました)

なので、
<?php
$xl = new PHPExcel();
$xl->setActiveSheetIndex(0);

$sheet1 = $xl->getActiveSheet(); //$sheet1には一枚目のシートのインスタンスを代入

$xl->createSheet();
$xl->setActiveSheetIndex(1);

$sheet2 = $xl->getActiveSheet(); //$sheet2に二枚目のシートのインスタンスを代入

?>
と別々の変数にそれぞれのシートのインスタンスを代入してやれば、それぞれ操作することが出来ると思います。

今日まで、実際にPHPExcelを使ったことがないのでアレなんですが、
http://journal.mycom.co.jp/articles/2009/03/06/phpexcel/index.html
こちら(マイコミジャーナル)の記事を見る限りでは、
PHPExcelをnewした時点で一枚目のシートは自動的に生成されるようです。
(実際にスクリプトコピペして試してみたところ正しく動作しました)

なので、
<?php
$xl = new PHPExcel();
$xl->setActiveSheetIndex(0);

$sheet1 = $xl->getActiveSheet(); //$sheet1には一枚目のシートのインスタンスを代入

...続きを読む

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qアップロードファイル名の文字化け

いつもお世話になっております。

アップロードしたファイルから
$_FILES['userfile']['name'];で、アップしたファイル名を取得しようとするときにファイル名に
特定(後半1バイトが'5C')の漢字を含むとPHPが、'\'と誤認して該当の文字から前を消して表示してきます。
例えば、「内部構造.txt」は、「造.txt」に化けます。move_uploaded_file関数で、アップしたファイルをどこかに保存しようにも、ファイル名が正しく指定できません。
どなたか、対策方法をご教授頂けませんでしょうか?
よろしくお願いいたします。

<?
mb_internal_encoding("EUC");

echo "userfile_name is ".$_FILES['userfile']['name'];
echo "<br>";
echo "userfile_type is ".$_FILES['userfile']['type'];
echo "<br>";
echo "MAX_FILE_SIZE is ".$_POST["MAX_FILE_SIZE"];
echo "<br>";
echo "userfile_tmp_name is ".$_FILES['userfile']['tmp_name'];
echo "<br>";
echo "userfile_error is ".$_FILES['userfile']['error'];
echo "<br>";
echo "userfile_size is ".$_FILES['userfile']['size'];
echo "<br>";


$dir="c:/work/";


if (move_uploaded_file($_FILES['userfile']['tmp_name'], $dir.$_FILES['userfile']['name'])) {
print "File is valid, and was successfully uploaded. ";
}
else
print("UPLOAD ERROR!!");

?>

いつもお世話になっております。

アップロードしたファイルから
$_FILES['userfile']['name'];で、アップしたファイル名を取得しようとするときにファイル名に
特定(後半1バイトが'5C')の漢字を含むとPHPが、'\'と誤認して該当の文字から前を消して表示してきます。
例えば、「内部構造.txt」は、「造.txt」に化けます。move_uploaded_file関数で、アップしたファイルをどこかに保存しようにも、ファイル名が正しく指定できません。
どなたか、対策方法をご教授頂けませんでしょうか?
よろしくお願いいた...続きを読む

Aベストアンサー

Unix系のユーザーかとおもったら、
>$dir="c:/work/";
を見ると、Windowsユーザーですね。

全角文字を使ってファイルを保存したいのなら、
move_uploaded_fileに渡すファイル名をSJISに変換してあげましょう。
mb_convert_encoding($_FILES['userfile']['name'],'SJIS')、みたいに。
ファイル処理は、OSの規則に沿ってください。

\(5C)の問題は、PHPのバージョンにもよりますが、
>echo "userfile_name is ".$_FILES['userfile']['name'];
これで、何が表示されていますか?
EUCできちんと表示されている気がしますが、どうなんでしょ?
まずは、最初の問題をクリアしてください。

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい


人気Q&Aランキング