PHPEXCEL将EXCEL文件内容复制多份,包括样式。

tong_何 2012-10-10 03:23:32
利用PHPEXCEL能否实现将一个EXCEL文件的内容复制多份并写入到另一个EXCEL中.PHP有别的方式能实现这样的效果吗?知道的大老们......, 非常感谢!
...全文
510 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuzuning 2012-10-12
终于写好了,先贴一个类
include 'PHPExcel/Classes/PHPExcel/IOFactory.php';

class fill_template {
var $startrow = 0;
function __construct($fn) {
$this->tpl = PHPExcel_IOFactory::load($fn);
}
function add_data($ar) {
$ar = array_values($ar);
if(!isset($this->target)) $this->target = clone $this->tpl;
$sheet = $this->tpl->getActiveSheet();
$i = 0;
foreach($sheet->getRowDimensions() as $y=>$row) {
foreach($sheet->getColumnDimensions($row) as $x=>$col) {
$txt = trim($sheet->getCell($x.$y)->getValue());
if($txt && $txt{0} == '#') $txt = isset($ar[$i]) ? $ar[$i++] : '';
$h = $y + $this->startrow;
$this->target->getActiveSheet()->getCell("$x$h")->setValue($txt);
$this->target->getActiveSheet()->duplicateStyle($sheet->getStyle("$x$y"), "$x$h");
}
}
foreach($sheet->getMergeCells() as $merge) {
$merge = preg_replace('/\d+/e',"$0+$this->startrow", $merge);
$this->target->getActiveSheet()->mergeCells($merge);
}
$this->startrow += $sheet->getHighestRow() + 3;//多加3行便于裁剪
}
function output($fn) {
$t = PHPExcel_IOFactory::createWriter($this->target, 'Excel5');
$t->save($fn);
}
}
用法
$p = new fill_template('tpl.xls');//实例化并加载模板xls
$p->add_data(array(1,2,3,4,5,6,7,8,9));//数据要按模板中“#”出现的次序排列
$p->add_data(array(1,2,3,4,5,6,7,8,9, 'a汉字'));//汉字要用utf-8的
$p->add_data(array(1,2,3,4,5,6,7,8,9));
$p->output('xxx.xls');//输出到文件
  • 打赏
  • 举报
回复
tong_何 2012-10-11
有谁能帮帮我?
  • 打赏
  • 举报
回复
tong_何 2012-10-11
[Quote=引用 10 楼 的回复:]
我理解楼主的意思是:
将一个只有格式的 Excel 作为模板
然后从数据库里读取数据填写进去
每条数据填一个,最后保存为一个 Excel 以便打印

如果是的话,存在一个问题:如何知道哪个单元格填什么?
有什么约定吗?
[/Quote]
就是这个意思,单元格填的值是有约定的。就是不知道怎么能够每一条数据填一个时怎么能得到它的样式,我现在只有第一个会有样式,后面的都不会有。代码如下:
require_once APPPATH.'libraries/PHPExcel/Iofactory'.EXT;
require_once APPPATH.'libraries/Phpexcel'.EXT;

$filePath = iconv("utf-8","gb2312",$num[0]['path']);
$PHPExcel = new PHPExcel();
$PHPReader = new PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($filePath)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($filePath)){
echo 'no Excel';
return ;
}
}
$PHPExcel = $PHPReader->load($filePath);

$currentSheet = $PHPExcel->getSheet(0); //读取excel文件中的第一个工作表

//$sheet = $PHPExcels->getActiveSheet(); // 获取当前激活的工作表
$i = 1;
foreach ($data as $k=>$v){
if($num[0]['type'] == 3)
$dataHouse = mod_fee::view_pre_month_man(self::$corpId,$v['house_no']);
else
$dataHouse = mod_fee::view_fee_payment_select($value,self::$corpId,$v['house_id']);

$allColumn = $currentSheet->getHighestColumn(); //取得最大的列号

$amount = 0;

$allRow = $currentSheet->getHighestRow(); //取得一共有多少行

for($currentRow = 2;$currentRow <= $allRow;$currentRow++){ //从第二行开始输出,因为excel表中第一行为列名
$i++;

for($currentColumn= 'A';$currentColumn<= $allColumn; $currentColumn++){ //从第A列开始输出
$val = trim($currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65,$currentRow)->getValue());//ord()将字符转为十进制数

//如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出
if($num[0]['type'] == 3){

foreach ($dataHouse as $k=>$vals){
$amount += $vals['recharge'];

switch ($val){
case '#制表日期':
$val=date("Y-m-d",time());
break;
case '#房产编号':
$val=$vals['house_no'];
break;
case '#占用者名称':
$val=$vals['owner_name'];
break;
case '#管理费费用说明':
$val=$vals['fee_name'];
break;
case '#租金费用说明':
$val=$vals['fee_name'];
break;
case '#电梯分摊费用说明':
$val=$vals['fee_name'];
break;
case '#推广费费用说明':
$val=$vals['fee_name'];
break;
case '#管理费充值时间':
$val=date("Y-m-d",$vals['uptime']);
break;
case '#租金费充值时间':
$val=date("Y-m-d",$vals['uptime']);
break;
case '#推广费充值时间':
$val=date("Y-m-d",$vals['uptime']);
break;
case '#电梯分摊费充值时间':
$val=date("Y-m-d",$vals['uptime']);
break;
case '#管理费开始时间':
$val=date("Y-m-d",$vals['start_time']);
break;
case '#租金费开始时间':
$val=date("Y-m-d",$vals['start_time']);
break;
case '#电梯分摊费开始时间':
$val=date("Y-m-d",$vals['start_time']);
break;
case '#推广费开始时间':
$val=date("Y-m-d",$vals['start_time']);
break;
case '#管理费':
$val=$vals['recharge'];
break;
case '#租金':
$val=$vals['recharge'];
break;
case '#电梯分摊费':
$val=$vals['recharge'];
break;
case '#推广费':
$val=$vals['recharge'];
break;
case '#费用合计':
$val=$amount;
break;


}
}
}else{
foreach ($dataHouse as $k=>$vals){

switch ($val){
case '#抄表日期':
$val='';
break;
case '#房产编号':
$val=$vals['resource_no'];
break;
case '#应收日期':
$val=date("Y-m-d",$vals['should_date']);
break;
case '#占用者名称':
$val=$vals['owner_name'];
break;
case '#制表日期':
$val=date("Y-m-d",time());
break;
case '#概要说明':
$val=$vals['schema_number'];
break;
case '#电费费用说明':
$val=$vals['fee_desc'];
break;
case '#水费费用说明':
$val=$vals['fee_desc'];
break;
case '#管理费费用说明':
$val=$vals['fee_desc'];
break;
case '#租金费用说明':
$val=$vals['fee_name'];
break;
case '#电梯分摊费费用说明':
$val=$vals['fee_name'];
break;
case '#推广费费用说明':
$val='';
break;
case '#电表上次行度':
$val='';
break;
case '#电表本次行度':
$val='';
break;
case '#电表用量':
$val='';
break;
case '#电表单价':
$val='';
break;
case '#电表金额':
$val='';
break;
case '#水表金额':
$val='';
break;
case '#管理费':
$val=$vals['amount'];
break;
case '#租金':
$val=$vals['amount'];
break;
case '#电梯分摊':
$val=$vals['amount'];
break;
case '#推广费':
$val=$vals['amount'];
break;
case '#本次应收':
$val=$vals['amount'];
break;
case '#未收总计':
$val=$vals['amount'];
break;
case '#水表上次行度':
$val='';
break;
case '#水表本次行度':
$val='';
break;
case '#水表用量':
$val='';
break;
case '#水表单价':
$val='';
break;
case '#管理费标准':
$val='';
break;
case '#建筑面积':
$val=$vals['build_area'];
break;
case '#累计欠款':
$val='';
break;
case '#滞纳金计算日期':
$val=$vals['late_calc_time'];
break;

}
}
}
// $sheet->getColumnDimension($currentColumn) ->setAutoSize(true); // 自动适应列宽


$PHPExcels->getActiveSheet()->setCellValue($currentColumn."$i", "$val");
//$PHPExcels->getColumnDimension($currentColumn)->setAutoSize(true);
// $objActsheet->duplicateStyle();

}
}
}

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$num[0]['title'].'"');
header('Cache-Control: max-age=0');

$PHPExcels->setActiveSheetIndex(0);
$objWriter = Iofactory::createWriter($PHPExcels, 'Excel5');
$objWriter->save('php://output');
  • 打赏
  • 举报
回复
xuzuning 2012-10-11
我理解楼主的意思是:
将一个只有格式的 Excel 作为模板
然后从数据库里读取数据填写进去
每条数据填一个,最后保存为一个 Excel 以便打印

如果是的话,存在一个问题:如何知道哪个单元格填什么?
有什么约定吗?
  • 打赏
  • 举报
回复
tong_何 2012-10-11
  • 打赏
  • 举报
回复
tong_何 2012-10-10
[Quote=引用 5 楼 的回复:]
PHP code

require 'PHPExcel.php';
$excel = new Spreadsheet_Excel_Reader();
$excel->read("a.xls");//读取的xls文件
$key=array();
for ($i = 1; $i <= $excel->sheets[0]['numRows']; $i++) {
for ($j = ……
[/Quote]
这个是没有样式的,只有数据。
  • 打赏
  • 举报
回复
tong_何 2012-10-10
后边半句是这个意思,不是一个EXCEL的N条内容,是把每一条数据放入这个EXCEL中,最后得到的一N个原EXCEL内容的合集。
  • 打赏
  • 举报
回复
xuyanlu 2012-10-10
你的意思是把一个Excel中的N条内容,每条分别存入一个Excel中?也就是说生成 N个Excel?
  • 打赏
  • 举报
回复
bing15 2012-10-10
require 'PHPExcel.php';
$excel = new Spreadsheet_Excel_Reader();
$excel->read("a.xls");//读取的xls文件
$key=array();
for ($i = 1; $i <= $excel->sheets[0]['numRows']; $i++) {
for ($j = 1; $j <= $excel->sheets[0]['numCols']; $j++) {
//显示每个单元格内容
if(isset($excel->sheets[0]['cells'][$i][$j])) {
$key[]=$excel->sheets[0]['cells'][$i][$j]."\r\n";
}
}
}
$b='b.xls';//写入到xls文件
$h=fopen($b,'a');
foreach($key as $val){
$str.=$val;
}
for($i=0;$i<10;$i++){//复制的次数
fwrite($h,$str);
}
fclose($h);
  • 打赏
  • 举报
回复
tong_何 2012-10-10
知道的,帮帮忙吧,最近项目很急啊,这个做了好久都没能实现,新手望各位同行指点啊。
  • 打赏
  • 举报
回复
tong_何 2012-10-10
就是,物业公司给每个住户发费用通知单那种效果,物业公司定义一个EXCEL格式,后台将每个业主的费用导出,
  • 打赏
  • 举报
回复
tong_何 2012-10-10
如果用户有100条数据,我要根据他上传的EXCEL文件,将它的数据写入EXCEL当中,每一条对应上传时的一个EXCEL,为了方便不可能去生成100个EXCEL文件,只能将这些内容放到一个EXCEL文件中。
  • 打赏
  • 举报
回复
xuyanlu 2012-10-10
PHP中直接用copy()文件不行么?为啥还有获取数据,再存入另一个文件呢?
  • 打赏
  • 举报
回复
相关推荐
发帖
PHP

2.0w+

社区成员

“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
帖子事件
创建了帖子
2012-10-10 03:23
社区公告
暂无公告