创建供下载的 csv 文件的最佳方法是什么?
What is the best way to create a csv file for download?
我有一个创建 "Work tickets" 的 Web 应用程序。我的客户要求报告页面让他们能够将报告下载为 csv 文件。我有这个功能。本质上,它是在创建报告 table 时即时创建 CSV。如果 table 中没有很多数据,则可以下载 csv。我有 运行 的是,当 table 太大时,我达到了可以在 url 中传递的字符的限制。我该如何解决这个问题?这让我发疯。下面是我的 php 和 html 代码的示例。
PHP 创建 CSV 下载的代码
<?php
$out = '';
$filename_prefix = 'UnInvoiced';
if (isset($_REQUEST['csv_hdr'])) {
$out .= $_REQUEST['csv_hdr'];
$out .= "\n";
}
if (isset($_REQUEST['csv_output'])) {
$out .= $_REQUEST['csv_output'];
}
$filename = $filename_prefix."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-Encoding: UTF-8");
header("Content-type: text/csv; charset=UTF-8");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
print $out;
exit;
?>
PHP 在 HTML 页面上创建初始 Table 的代码。
echo "<div class='panel panel-primary'>
<div class='panel-heading'>
<h3 class='panel-title'>Un-Invoiced Tickets</h3>
</div>
<table class='table'>
<thead>
<tr class='filters'>
<th>Date</th>
<th>Ticket #</th>
<th>Client</th>
<th>Lease</th>
<th>Ticket Total</th>
<th>Ordered By</th>
</tr>
</thead>
<tbody>";
$conn = sqlsrv_connect($DBSERV, $connection);
if (!$conn) {
die('Could not connect: ' . sqlsrv_error($conn));
}
if ($client === 'All'){
$sql="SELECT REPLACE(Client,',',' ')
AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal FROM WorkTicket WHERE Date BETWEEN '".$begin."' AND '".$end."' AND Invoiced IS NULL ORDER BY Client ";
}else{
$sql="SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal FROM WorkTicket WHERE Date BETWEEN '".$begin."' AND '".$end."' AND Invoiced IS NULL AND Client = '".$client."' ORDER BY Client ";
}
$result =sqlsrv_query($conn, $sql);
while($row = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)) { ?>
<tr>
<td> <?php echo $row['Date'];
$csv_output .= $row['Date'].", "; ?> </td>
<td> <?php echo $row['WorkTicketNum'];
$csv_output .= $row['WorkTicketNum'].", "; ?> </td>
<td> <?php echo $row['Client'];
$csv_output .= $row['Client'].", "; ?> </td>
<td> <?php echo $row['Lease'];
$csv_output .= $row['Lease'].", "; ?> </td>
<td> <?php echo $row['WTTotal'];
$csv_output .= $row['WTTotal'].", "; ?> </td>
<td> <?= $row['OrderedBy'];
$csv_output .= $row['OrderedBy']."\n "; ?> </td>
</tr>
<?php
}
echo " </tbody>
</table>
</div>
<br />
<a class='btn btn-default' href='/processes/uninvoicedexport.php? csv_hdr=".urlencode($csv_hdr)."&csv_output=".urlencode($csv_output)."'>Export to CSV</a>";
/*<form name='export' action='/processes/unsignedexport.php' method='post' target='_BLANK'>
<input type='submit' value='Export table to CSV'>
<input type='hidden' value=".$csv_hdr." name='csv_hdr'>
<input type='hidden' value=".$csv_output." name='csv_output'>
</form>
<div id='ticketHint'><b></b></div>
</form>";*/
sqlsrv_close($conn);
?>
有人建议我将 csv 写入 SQL 数据库,然后在按下下载按钮时检索,但我一辈子都不知道该怎么做。
您可以(也可能应该)使用 mysql 作为输出:
SELECT * FROM tableName INTO OUTFILE 'filename.csv'
这将为您生成文件,无需通过您的 url 传递数据。当然,您可以选择要导出的任何字段。
如果您的 mysql 用户没有权限 select 到 outfile 并且喜欢上面的评论,请不要将所有数据传递给 url。
尝试这样的事情(未测试,但应该给你想法):
<?php
if ($_REQUEST["myaction"]=="getcsvstuff") {
// handle the conditions you passed into $_POST or $_REQUEST
// set your headers, do your query and output the csv results
} else {
// print your form to pass what you would like
// you may have visual results of your query here in your table etc
// just like your example
?>
<form action="<?php $_SERVER["PHP_SELF"];?>" method="POST">
<input type="hidden" name="myaction" value="getcsvstuff" />
<input type="submit" value="go to csv results" />
... whatever else you want to pass to the above condition...
</form>
<?php
}
?>
我有一个创建 "Work tickets" 的 Web 应用程序。我的客户要求报告页面让他们能够将报告下载为 csv 文件。我有这个功能。本质上,它是在创建报告 table 时即时创建 CSV。如果 table 中没有很多数据,则可以下载 csv。我有 运行 的是,当 table 太大时,我达到了可以在 url 中传递的字符的限制。我该如何解决这个问题?这让我发疯。下面是我的 php 和 html 代码的示例。
PHP 创建 CSV 下载的代码
<?php
$out = '';
$filename_prefix = 'UnInvoiced';
if (isset($_REQUEST['csv_hdr'])) {
$out .= $_REQUEST['csv_hdr'];
$out .= "\n";
}
if (isset($_REQUEST['csv_output'])) {
$out .= $_REQUEST['csv_output'];
}
$filename = $filename_prefix."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-Encoding: UTF-8");
header("Content-type: text/csv; charset=UTF-8");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
print $out;
exit;
?>
PHP 在 HTML 页面上创建初始 Table 的代码。
echo "<div class='panel panel-primary'>
<div class='panel-heading'>
<h3 class='panel-title'>Un-Invoiced Tickets</h3>
</div>
<table class='table'>
<thead>
<tr class='filters'>
<th>Date</th>
<th>Ticket #</th>
<th>Client</th>
<th>Lease</th>
<th>Ticket Total</th>
<th>Ordered By</th>
</tr>
</thead>
<tbody>";
$conn = sqlsrv_connect($DBSERV, $connection);
if (!$conn) {
die('Could not connect: ' . sqlsrv_error($conn));
}
if ($client === 'All'){
$sql="SELECT REPLACE(Client,',',' ')
AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal FROM WorkTicket WHERE Date BETWEEN '".$begin."' AND '".$end."' AND Invoiced IS NULL ORDER BY Client ";
}else{
$sql="SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal FROM WorkTicket WHERE Date BETWEEN '".$begin."' AND '".$end."' AND Invoiced IS NULL AND Client = '".$client."' ORDER BY Client ";
}
$result =sqlsrv_query($conn, $sql);
while($row = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)) { ?>
<tr>
<td> <?php echo $row['Date'];
$csv_output .= $row['Date'].", "; ?> </td>
<td> <?php echo $row['WorkTicketNum'];
$csv_output .= $row['WorkTicketNum'].", "; ?> </td>
<td> <?php echo $row['Client'];
$csv_output .= $row['Client'].", "; ?> </td>
<td> <?php echo $row['Lease'];
$csv_output .= $row['Lease'].", "; ?> </td>
<td> <?php echo $row['WTTotal'];
$csv_output .= $row['WTTotal'].", "; ?> </td>
<td> <?= $row['OrderedBy'];
$csv_output .= $row['OrderedBy']."\n "; ?> </td>
</tr>
<?php
}
echo " </tbody>
</table>
</div>
<br />
<a class='btn btn-default' href='/processes/uninvoicedexport.php? csv_hdr=".urlencode($csv_hdr)."&csv_output=".urlencode($csv_output)."'>Export to CSV</a>";
/*<form name='export' action='/processes/unsignedexport.php' method='post' target='_BLANK'>
<input type='submit' value='Export table to CSV'>
<input type='hidden' value=".$csv_hdr." name='csv_hdr'>
<input type='hidden' value=".$csv_output." name='csv_output'>
</form>
<div id='ticketHint'><b></b></div>
</form>";*/
sqlsrv_close($conn);
?>
有人建议我将 csv 写入 SQL 数据库,然后在按下下载按钮时检索,但我一辈子都不知道该怎么做。
您可以(也可能应该)使用 mysql 作为输出:
SELECT * FROM tableName INTO OUTFILE 'filename.csv'
这将为您生成文件,无需通过您的 url 传递数据。当然,您可以选择要导出的任何字段。
如果您的 mysql 用户没有权限 select 到 outfile 并且喜欢上面的评论,请不要将所有数据传递给 url。
尝试这样的事情(未测试,但应该给你想法):
<?php
if ($_REQUEST["myaction"]=="getcsvstuff") {
// handle the conditions you passed into $_POST or $_REQUEST
// set your headers, do your query and output the csv results
} else {
// print your form to pass what you would like
// you may have visual results of your query here in your table etc
// just like your example
?>
<form action="<?php $_SERVER["PHP_SELF"];?>" method="POST">
<input type="hidden" name="myaction" value="getcsvstuff" />
<input type="submit" value="go to csv results" />
... whatever else you want to pass to the above condition...
</form>
<?php
}
?>