phpExcel Class

phpExcel,操作excel很方便,尤其是可以方便的加入圖片,支持jpg gif png格式。

下載地址:http://www.codeplex.com/PHPExcel

下面是總結的幾個使用方法

 

include 'PHPExcel.php';

include 'PHPExcel/Writer/Excel2007.php';

//或者include 'PHPExcel/Writer/Excel5.php'; 用於輸出.xls的

//創建一個excel

$objPHPExcel = new PHPExcel();

//保存excel—2007格式

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

//或者$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); 非2007格式

$objWriter->save("xxx.xlsx");

//直接輸出到瀏覽器

$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);

header("Pragma: public");

header("Expires: 0");

header("Cache-Control:must-revalidate, post-check=0, pre-check=0");

header("Content-Type:application/force-download");

header("Content-Type:application/vnd.ms-execl");

header("Content-Type:application/octet-stream");

header("Content-Type:application/download");;

header('Content-Disposition:attachment;filename="resume.xls"');

header("Content-Transfer-Encoding:binary");

$objWriter->save('php://output');

——————————————————————————————————————–

//設置excel的屬性:

//創建人

$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");

//最後修改人

$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");

//標題

$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");

//題目

$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");

//描述

$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");

//關鍵字

$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");

//種類

$objPHPExcel->getProperties()->setCategory("Test result file");

——————————————————————————————————————–

//設置當前的sheet

$objPHPExcel->setActiveSheetIndex(0);

//設置sheet的name

$objPHPExcel->getActiveSheet()->setTitle('Simple');

//設置單元格的值

$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String');

$objPHPExcel->getActiveSheet()->setCellValue('A2', 12);

$objPHPExcel->getActiveSheet()->setCellValue('A3', true);

$objPHPExcel->getActiveSheet()->setCellValue('C5', '=SUM(C2:C4)');

$objPHPExcel->getActiveSheet()->setCellValue('B8', '=MIN(B2:C5)');

//合併單元格

$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');

//分離單元格

$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');

//保護cell

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // Needs to be set to true in order to enable any worksheet protection!

$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel');

//設置格式

// Set cell number formats

echo date('H:i:s') . " Set cell number formats\n";

$objPHPExcel->getActiveSheet()->getStyle('E4')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);

$objPHPExcel->getActiveSheet()->duplicateStyle( $objPHPExcel->getActiveSheet()->getStyle('E4'), 'E5:E13' );

//設置寬width

// Set column widths

$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);

//設置font

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20);

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);

$objPHPExcel->getActiveSheet()->getStyle('E1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);

$objPHPExcel->getActiveSheet()->getStyle('D13')->getFont()->setBold(true);

$objPHPExcel->getActiveSheet()->getStyle('E13')->getFont()->setBold(true);

//設置align

$objPHPExcel->getActiveSheet()->getStyle('D11')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

$objPHPExcel->getActiveSheet()->getStyle('D12')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);

//垂直居中

$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

//設置column的border

$objPHPExcel->getActiveSheet()->getStyle('A4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

$objPHPExcel->getActiveSheet()->getStyle('B4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

$objPHPExcel->getActiveSheet()->getStyle('C4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

$objPHPExcel->getActiveSheet()->getStyle('D4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

$objPHPExcel->getActiveSheet()->getStyle('E4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

//設置border的color

$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getLeft()->getColor()->setARGB('FF993300');

$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getTop()->getColor()->setARGB('FF993300');

$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');

$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getTop()->getColor()->setARGB('FF993300');

$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');

$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getRight()->getColor()->setARGB('FF993300');

//設置填充顏色

$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);

$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF808080');

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->getStartColor()->setARGB('FF808080');

//加圖片

$objDrawing = new PHPExcel_Worksheet_Drawing();

$objDrawing->setName('Logo');

$objDrawing->setDescription('Logo');

$objDrawing->setPath('./images/officelogo.jpg');

$objDrawing->setHeight(36);

$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

$objDrawing = new PHPExcel_Worksheet_Drawing();

$objDrawing->setName('Paid');

$objDrawing->setDescription('Paid');

$objDrawing->setPath('./images/paid.png');

$objDrawing->setCoordinates('B15');

$objDrawing->setOffsetX(110);

$objDrawing->setRotation(25);

$objDrawing->getShadow()->setVisible(true);

$objDrawing->getShadow()->setDirection(45);

$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

//在默認sheet後,創建一個worksheet

echo date('H:i:s') . " Create new Worksheet object\n";

$objPHPExcel->createSheet();

$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');

$objWriter-save('php://output');

 

35人死亡-不能超過35人死亡的中國秘密

溫州動車追撞事故,震驚世人,中國高鐵誇張的神話頓時破滅。G+的簡體中文用戶圈裏開始流傳一則訊息: 這個事故裏中國鐵道部官方宣佈死亡35人很值得懷疑,因為過去有太多的事故,死亡人數都剛好是”35人”。

中國網民整理出過去幾年裏的事故新聞,死亡人數是35人的竟然特別的多:

為何死亡人數一定要35人呢? 中國網民這樣解釋:

“超過36人,市委書記這個級別的要撤職,所以一開始發生,就注定了死亡人數不會超過36。”

真有這條規定,可能有些死亡更多的事故災難,人數就會被少報。36人,37人,38人,說不定連50人死亡的事故都會被謊報壓縮成35人。這樣我們就懂了,為何那則中國鐵道部的新聞裏還會出來開記者會反駁其它說法裏的數字,把死亡人數定調在35人,原來有這個不能說的秘密。

不過也許有人會說,那一長串整理出來的新聞說不定是巧合,其它在中國死亡34人,36人的事故新聞我也可以整理出來一大堆。畢竟十幾億人口啊。

我想到了一個方法來驗証。如果真有不少死亡人數在36(含)人以上的事故,都會被統一口徑宣佈死亡人數只有35人,那麼這種報導一定特別多。我們可以用搜尋引擎,去看頁面中有”34人死亡”,”35人死亡”,”36人死亡”等這些字的關鍵字頁面的總頁數,來看看有沒有什麼異常,就可以知道消是不是有些消息被刻意的篡改掩飾了。

中文中有時候會用”32人死亡”,有時候會用”死亡32人”,意思是一樣的,所以我兩個都算,再相加。另外這要看簡體字的,位於中國的頁面,所以使用Google檢索時是用進階搜尋的方法。從32人到39人,整個統計數字和圖表如下:

這個結果也太戲劇化了。死亡人數35人的報導真的遙遙領先,是其它人數的兩倍左右,多幾百萬頁,一眼就可以看出來相當的不合理!!

The Web Based Spreadsheet

What is jQuery.sheet?

jQuery.sheet gives you all sorts of possibilities when it comes to giving your web application a spreadsheet style interface with MS Excel style calculations.

jQuery.sheet manages the sheet creation, viewing, and editing processes. It can even be used like a datagrid, without calculations.
For a complete list of all the MS Excel style functions that jQuery.sheet supports, take a look at the Demo, which is the documentation.

Why did I start jQuery.sheet? I like a challenge, I like to learn, I like to contribute, and I saw where other attempts at the same thing, although being nice, could be improved and I wanted to put some fun back into my javascript.

ref : http://visop-dev.com/Project+jQuery.sheet
Documentation as spreadsheet – Demo that comes with jQuery.sheet

MySQL 設定 Replication (Master – Slave)

MySQL 設定寫入 Master 後, 自動 Replication 到 Slave 去, 運作基本原理是:

  1. INSERT/UPDATE/DELETE 語法, 自動寫入 Master 的 binlog file.
  2. 由 GRANT REPLICATION 授權的帳號, 自動將 SQL 語法 repl 到 Slave 的 DB 執行.
  3. 因而完成 Replication 的動作.

下述詳細可見: MySQL 5.0 Reference Manual :: 15 Replication

設定 Replication 的操作 (Master)

  1. $ sudo vim /etc/mysql/my.cnf # 下面是 Debian Linux 的設定, 找到下面的設定, 新增/修改 成下面這樣子.

    #bind-address           = 127.0.0.1
    server-id               = 1
    log_bin                 = /var/log/mysql/mysql-bin.log

    # 若是 innodb, 且有用 transaction 的話, 需再加入下面兩行
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1

  2. $ sudo /etc/init.d/mysql restart
  3. $ mysql -u root -p # 進入 mysql
  4. mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘repl_pass’; # 先假設 帳號 repl, 密碼 repl_pass, 此步驟是 設定 repl 的帳號/密碼, 格式: GRANT REPLICATION SLAVE ON *.* TO
    ‘repl_user’@’%.mydomain.com’ IDENTIFIED BY ‘repl_password’; (Replace
    <some_password>with a real password!)
  5. mysql> FLUSH TABLES WITH READ LOCK; # 先讓 DB 不要再寫資料進去
  6. mysql> SHOW MASTER STATUS; # 這邊資料都要記好, 等一下設定 Slave 要用

+———————-+————+——————+———————-+
| File                                | Position       | Binlog_Do_DB | Binlog_Ignore_DB           |
+———————-+————+——————+———————-+
| mysql-bin.000014      |      232         |                                 |                                       |
+———————-+————+——————+———————-+

  1. mysql> quit # 離開, 準備倒資料
  2. 倒資料, 可以由下述的方法倒, 此次採用步驟 1
    1. $ mysqldump -u root -p DB > dbdump.sql
    2. $ mysqldump –all-databases –lock-all-tables >dbdump.sql
    3. $ mysqldump –all-databases –master-data >dbdump.sql # –master-data: 會自動將CHANGE MASTER 的語法帶在裡面
  3. $ mysql -u root -p # 進入 mysql
  4. mysql> UNLOCK TABLES; # dump 完資料後, 進去 mysql 解除唯讀
  5. 再來就是將 dbdump.sql scp 到 Slave 去即可.
  6. Master 就到此為止.

設定 Replication 的操作 (Slave)

  1. $ sudo vim /etc/mysql/my.cnf

    server-id               = 2  # server-id 不能與其它機器相同
    log_bin                 = /var/log/mysql/mysql-bin.log

  2. $ mysql -u root -p # 進入 mysql
  3. mysql> create database DBNAME;
  4. mysql> use DBNAME; source dbdump.sql; 或 $ mysql -u root -p DBNAME < dbdump.sql
  5. mysql> CHANGE MASTER TO
    MASTER_HOST=’MASTER_HOSTNAME’,
    MASTER_USER=’repl’,
    MASTER_PASSWORD=’repl_pass’,
    MASTER_LOG_FILE=’mysql-bin.000014′,
    MASTER_LOG_POS=232; # 這邊就要用到之前 Master 抄下來的值.
  6. mysql> START SLAVE; # 這樣子就會開始 Replication 了, 會將 LOG_POS 之後新的資料開始 sync 回來.
  7. mysql> show master status; # 檢查一下設定
  8. mysql> show slave status; # 檢查一下設定, 看是不是有異常狀況.

測試

  1. 在 master: mysql> create database test2;
  2. 在 slave: mysql> show database; # 應該會看到 test2
  3. 在 master 上的任何操作應該都會馬上 replication 到 slave 去.

其它相關網頁

 

MySQL 多台機器的多重 Replication 設定

要設定多台機器一直持續(一層一層) Replication 下去, 預設是有無法達到的.

註:

  • Replication 從 A -> B 照上面設定即可.
  • 但是 Replication 要設定 A -> B -> C, 會發現到, A -> B 是可以動的, B -> C 也是可以動, 但是 A -> B -> C 不會動.(A -> C 的指令, 不會被傳過去)

 

MySQL 多台機器多重 Replication 設定方式

想要作到 A -> B -> C, 只需要於 B 的 [mysqld] 設定下述即可:

log-bin=mysql-bin
log-slave-updates

範例

[mysqld]
server-id = 1
log-bin=mysql-bin
log-slave-updates

詳細說明: MySQL Reference Manual :: 15.1.2.3 Replication Slave Options and Variables

相關網頁