2016-09-12 5 views
0

Ну, я хотел бы написать файл Excel с помощью PHP-скрипта. Фактически, когда пользователь отправляет форму, мы получаем почту и текущую дату, чтобы поместить ее в Excel.Запись в файл Excel с помощью PHPExcel

Письмо должно быть в одной колонке и дате тоже.

Так что это моя форма (классическая форма):

<form action="mail.php" method="POST"> 
    <label for="name">Nom*<br /> 
     <input id="name" type="text" name="Nom" /> 
    </label><br /><br /> 

    <label for="mail">Mail*<br /> 
     <input id="mail" type="email" name="Email" /> 
    </label><br /><br /> 

    <label for="tel">Téléphone*<br /> 
     <input id="tel" type="text" name="Téléphone" /> 
    </label><br /><br /> 

    <label for="comment">Commentaire*<br /> 
     <textarea id="comment" type="text" name="Commentaires"> </textarea> 
    </label><br /><br /> 

    <input type="submit" value="Envoyer" /> 
</form> 

И мой mail.php, так что здесь я использую классы PHPExcel:

<?php 
/** Error reporting */ 
error_reporting(E_ALL); 

/** PHPExcel */ 
include './Classes/PHPExcel.php'; 

/** PHPExcel_Writer_Excel2007 */ 
include 'PHPExcel/Writer/Excel2007.php'; 
include './Classes/PHPExcel/IOFactory.php'; 

/* Set the variables */ 
$mail = $_POST['Email']; 

// Line number 
$ligne = 1; 

// Excel object 
$fichier = new PHPExcel(); 
$fichier->getProperties()->setCreator("Don't know"); 
//Set the size 
$fichier->getActiveSheet()->getColumnDimension('A')->setWidth(30); 
$fichier->getActiveSheet()->getColumnDimension('B')->setWidth(30); 

$fichier->setActiveSheetIndex(0); 
$feuille = $fichier->getActiveSheet(); 

function writeExcel($objExcel, $sheet, $email){ 
    $sheet->SetCellValue('A'.$ligne, $email); 
    $sheet->SetCellValue('B'.$ligne, date("Y-m-d H:i")); 
    $objWriter = new PHPExcel_Writer_Excel2007($objExcel); 
    $objWriter->save(str_replace('.php', '.xlsx', __FILE__)); 
    $ligne++; 
} 

writeExcel($fichier, $feuille, $mail); 
?> 

Я думаю, что это линия номер является проблемой, я не знаю, как организовать свой код. Каждый раз, когда пользователь отправляет форму, мы помещаем его почту (ячейку A1) и текущую дату (ячейку B1), а следующая почта должна быть в ячейке A2 и т. Д.

Я не знаю, если вы знаете, что я имею в виду ^^

EDIT С комментариями я изменил свой код! Но это же ^^

<?php 
/** Error reporting */ 
error_reporting(E_ALL); 

/** PHPExcel */ 
include './Classes/PHPExcel.php'; 

/** PHPExcel_Writer_Excel2007 */ 
include 'PHPExcel/Writer/Excel2007.php'; 
include './Classes/PHPExcel/IOFactory.php'; 

/* Set the variable */ 
$mail = $_POST['Email']; 

// Load file if it doesn't exists 
if (file_exists("mail.xlsx")) 
{ 
    $fichier = PHPExcel_IOFactory::load("mail.xlsx"); 
} 
else 
{ 
    $fichier = new PHPExcel(); 
} 
// Line number 
$ligne = $fichier->getActiveSheet()->getHighestRow() + 1; 

// Excel object 
$fichier->getProperties()->setCreator("Don't know"); 

//Set the size 
$fichier->getActiveSheet()->getColumnDimension('A')->setWidth(30); 
$fichier->getActiveSheet()->getColumnDimension('B')->setWidth(30); 

$fichier->setActiveSheetIndex(0); 
$feuille = $fichier->getActiveSheet(); 

// Line number 
global $ligne = $fichier->getActiveSheet()->getHighestRow() + 1; 

function writeExcel($objExcel, $sheet, $email){ 
    $sheet->SetCellValue('A'.global $ligne, $email); 
    $sheet->SetCellValue('B'.global $ligne, date("Y-m-d H:i")); 
    $objWriter = new PHPExcel_Writer_Excel2007($objExcel); 
    $objWriter->save(str_replace('.php', '.xlsx', __FILE__)); 
    global $ligne++; 
} 

writeExcel($fichier, $feuille, $mail); 
?> 

ПОСЛЕДНИЙ EDIT (НАДЕЮСЬ) Хорошо это работает: D

Это мой код:

<?php 
/** Error reporting */ 
error_reporting(E_ALL); 

/** PHPExcel */ 
include './Classes/PHPExcel.php'; 

/** PHPExcel_Writer_Excel2007 */ 
include 'PHPExcel/Writer/Excel2007.php'; 
include './Classes/PHPExcel/IOFactory.php'; 

/* Set the variable */ 
$mail = $_POST['Email']; 

// Load file if it doesn't exists 
if (file_exists('mail.xlsx')) 
{ 
    $objExcel = PHPExcel_IOFactory::load('mail.xlsx'); 
} 
else 
{ 
    $objExcel = new PHPExcel(); 
} 

$objExcel->getProperties()->setCreator("Don't know"); 

//Set the size 
$objExcel->getActiveSheet()->getColumnDimension('A')->setWidth(30); 
$objExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30); 

$objExcel->setActiveSheetIndex(0); 
$sheet = $objExcel->getActiveSheet(); 

// Line number 
$line = $objExcel->getActiveSheet()->getHighestRow() + 1; 

/* 
    This function write in the Excel file. 
    Note that the variables are passed by reference. 
*/ 
function writeExcel(&$objExcel, &$sheet, $email, &$line){ 
    $sheet->SetCellValue('A'.$line, $email); 
    $sheet->SetCellValue('B'.$line, date("Y-m-d H:i")); 
    $objWriter = new PHPExcel_Writer_Excel2007($objExcel); 
    $objWriter->save(str_replace('.php', '.xlsx', __FILE__)); 
}  

writeExcel($objExcel, $sheet, $mail, $line); 
?> 
+0

Я думаю, что ваша функция должна быть функцией writeExcel (& $ objExcel, & $ sheet, $ email) {// ваш код} –

+0

Могу ли я спросить, почему положить «&»? – Emilien

+3

'$ ligne' выходит за пределы области внутри функции' writeExcel() ' –

ответ

1

Прежде всего, вам нужно узнать около variable scope в PHP. Как отмечалось в комментариях, именно здесь лежит ваша главная проблема.

Вам также необходимо прочитать, как вы используете ключевое слово global, так как вы явно неправильно поняли это. Ну ... я бы порекомендовал не использовать его вообще вместо этого, так как обычно считается плохой вещью!
Вместо этого я рекомендую использовать метод, называемый pass by reference, что является ответом на ваш вопрос для первого комментария.

И наконец, пожалуйста, , пожалуйста,, напишите ваш код на английском языке. Не только ради нас, люди, которые пытаются помочь вам, но и для своих (и работодателей) в дальнейшем. Видя имена переменных и функций в языке, который вы не понимаете, серьезно затрудняет понимание кода и, таким образом, увеличивает вероятность возникновения ошибок. Всегда предполагайте, что другим людям нужно будет смотреть и понимать ваш код!

+0

Под «переменной областью» вы имеете в виду, что мой $ ligne плохо определен? Если это так плохо использовать «глобальный», то что я могу использовать? Мой код IS на английском языке, только переменные имени на французском языке ... НО, я поместил весь свой код на английском языке, справа ^^ – Emilien

+0

ЭТО ОК! Спасибо, действительно спасибо за всех ... Однако ваша первая ссылка не работает ^^ – Emilien

+0

Добро пожаловать, рад, что я мог бы помочь. Кроме того, исправлена ​​ссылка, поэтому она должна указывать на правильную страницу. Что касается того, что нужно использовать вместо «глобального»: вы можете использовать pass by reference, как я уже отмечал. Однако большую часть времени гораздо лучше реструктурировать свой код, так что вам не нужно полагаться на функции для изменения переданных им параметров. В этом случае, увеличивая число строк до вызова функции. Также желательно возвращать $ objExcel, а не передавать по ссылке. Чем меньше вы используете прохождение по ссылке и «глобальный», тем меньше вероятность непредвиденных последствий. – ChristianF

Смежные вопросы