React で実行されるのはクライアントサイドのコードです。そのため、直接 Windows PC 上の指定フォルダにファイルを保存することはできません。しかし、ユーザーがダウンロードフォルダを選択できるようにすることで、要件を満たすことができるかもしれません。
一つの解決策としては、Electron を使ってデスクトップアプリケーションに変換することが考えられます。これにより、Node.js の機能(fs モジュールなど)を直接使用して、指定されたフォルダにファイルを保存できます。
ただし、Electron を使用せずに現在の環境で実装する場合は、次のようにしてみてください。
- サーバーサイドのエンドポイントを作成し、クライアントサイドからそのエンドポイントにデータを送信します
- サーバーサイドで、受信したデータを CSV ファイルに変換し、指定されたフォルダに保存します
- ファイルが保存されたら、サーバーからクライアントに通知し、クライアントはその結果を表示します
サーバーサイドに Node.js を使用している場合は、以下のようなコードを実装して、上記手順を実現できます。
まず、Express を使ってサーバーサイドの API エンドポイントを作成します。
javascript
1
2const express = require('express');
3const fs = require('fs');
4const app = express();
5app.use(express.json());
6
7app.post('/save-csv', (req, res) => {
8 const data = req.body.data;
9 const filename = 'output-' + new Date().toISOString() + '.csv';
10 const filePath = '指定されたフォルダのパス/' + filename;
11
12 // dataをCSV形式に変換する処理を実装
13
14 fs.writeFileSync(filePath, data);
15 res.json({ message: 'CSVファイルが正常に保存されました' });
16});
17
18app.listen(3001, () => {
19 console.log('Server is running on port 3001');
20});
次に、クライアントサイドで、API エンドポイントにデータを送信する関数を実装します。
javascript
1async function saveCSVData(data) {
2 const response = await fetch('http://localhost:3001/save-csv', {
3 method: 'POST',
4 headers: {
5 'Content-Type': 'application/json'
6 },
7 body: JSON.stringify({ data: data })
8 });
9
10 const result = await response.json();
11 alert(result.message);
12}
これで、React からサーバーサイドの API エンドポイントにデータを送信し、サーバーサイドで CSV ファイルを生成し、指定されたフォルダに保存できます。ファイルが正常に保存されたら、サーバーからクライアントに通知が送られ、アプリケーション上でその結果を表示できます。
ただし、この方法ではクライアントサイドとサーバーサイドの間でデータのやり取りが発生し、インターネット環境が必要になります。また、セキュリティ上の問題がある場合がありますので、適切な認証や権限管理を行いましょう。
最後に、クライアント側で CSV 出力ボタンを押したときに saveCSVData 関数が呼び出されるように、ボタンのイベントハンドラを設定します。
javascript
1import React from 'react';
2
3function App() {
4 // CSV データを生成する関数を実装します。
5 // この例ではダミーデータを使っています。
6 function generateCSVData() {
7 const data = [
8 ['header1', 'header2', 'header3'],
9 ['row1-1', 'row1-2', 'row1-3'],
10 ['row2-1', 'row2-2', 'row2-3']
11 ];
12 return data.map(row => row.join(',')).join('\n');
13 }
14
15 async function handleExportCSV() {
16 const csvData = generateCSVData();
17 await saveCSVData(csvData);
18 }
19
20 return (
21 <div>
22 {/* 他のコンポーネントがここに表示されます */}
23 <button onClick={handleExportCSV}>CSV出力</button>
24 </div>
25 );
26}
27
28export default App;
このように実装することで、クライアントサイドからサーバーサイドへのデータの送信、サーバーサイドでの CSV ファイルの生成と保存、そしてサーバーからクライアントへの通知を行うことができます。ただし、この方法はクライアントとサーバーの両方を設定する必要があり、状況によってはセキュリティ上の問題も考慮する必要があります。