reactjs - 数组以 Excel React
问题描述
我对此有点陌生,我正在尝试将我的数据数组传递给 excel,但到目前为止对我没有任何作用
我有一个例子
import {ExcelFile, ExcelSheet} from "react-export-excel";
const [listSelectNewTable, setListSelectNewTable] = useState([])
const DataExcel = [
{
columns: [
{ value: "Clave Cliente", widthPx: 50 },
{ value: "Nobre Cliente", widthCh: 20, widthCh: 20 },
{ value: "Clave Articulo", widthPx: 60},
{ value: "Nombre Cliente", widthPx: 60},
{ value: "Clave Unidad", widthPx: 60},
{ value: "Precio", widthPx: 60},
],
data: [listSelectNewTable],
}
];
class Download extends React.Component {
render() {
return (
<ExcelFile>
<ExcelSheet dataSet={DataExcel} name="Price"/>
</ExcelFile>
);
}
有人可以告诉我我做错了什么吗?
解决方案
在我们开始之前:
很明显,如果您不将任何数据传递给
dataSet
:const [listSelectNewTable, setListSelectNewTable] = useState([]) // listSelectNewTable = []
您还试图在reactjsuseState
组件之外调用,然后继续使用组件。没有听起来居高临下的意思,你真的应该研究何时使用生命周期方法以及何时使用钩子(提示:它是一个或另一个),因为它超出了这个问题/答案的范围,但是你的代码如果您不花时间至少了解基础知识,那将永远无法工作。class
我的回答的其余部分假设你至少解决了这个问题。
问题:
此外,即使它有任何数据,也会导致错误,因为您的数据输入错误:
dataSet
道具type
定义为:
dataSet: Array<ExcelSheetData>
考虑以下包类型定义:
interface ExcelSheetData {
xSteps?: number;
ySteps?: number;
columns: Array<string>;
data: Array<ExcelCellData>;
}
type ExcelCellData = ExcelValue | ExcelCell;
type ExcelValue = string | number | Date | boolean;
interface ExcelCell {
value: ExcelCell;
// [Note]: this is actually incorrectly typed in the package itself.
// Should be value: ExcelCellValue instead
style: ExcelStyle;
}
本质上,如果您启用了打字稿(顺便说一句,我建议您这样做),您会看到您正在尝试将不正确的数据类型传递给dataSet
属性。
- 你应该传递给
dataSet
prop 的是Array<ExcellCellData> // expecting: Array<ExcelValue | ExcelCell> (eg. ['A', 22])
- 你实际上传递给
dataSet
prop 的是Array<Array<never>> // received: [[]] // [] = Array<never>
如您所见,Array<Array<>>
将它包装了两次,这意味着您在那里传递了一个不必要的包装数组。
解决方案:
现在我们知道了原因,让我们修复它:
const DataExcel = [
{
columns: [
{ value: "Clave Cliente", widthPx: 50 },
{ value: "Nobre Cliente", widthCh: 20, widthCh: 20 },
{ value: "Clave Articulo", widthPx: 60},
{ value: "Nombre Cliente", widthPx: 60},
{ value: "Clave Unidad", widthPx: 60},
{ value: "Precio", widthPx: 60},
],
data: listSelectNewTable, // previously was [listSelectNewTable]
// Note we removed the extra wrapping nested array [] ˆ
},
];
现在您正在正确地传递数据 - 但显然,除非您传递任何实际数据而不是空数组,否则 Excel 工作表中不会有任何内容来阻止列。
最后说明(不需要回答):
另外一般来说,我建议在他们的 github 页面上使用具有更高星级的包(这个有 65 星),并且只是现有包的一个分支,特别是对于更复杂的东西,比如 excel 导出。虽然有时原石中确实隐藏着钻石,但大多数时候星星是包装质量的良好指标。
在第一次随机浏览包后,我在自己的答案中发现了一个打字错误,这让我担心其中实际上还有多少其他错误,除非你知道并相信作者,或者它是一个非常适合小众市场的包事物。
因为递归
interface ExcelCell {
value: ExcelCell; // should be ExcelCellValue
style: ExcelStyle;
}
毫无意义,只需要您无限递归地声明对象接口定义
推荐阅读
- java - 当运行带有 -jar 选项的 java 命令时,是否可以使用 -cp 提供其他库?
- python - 类型错误:tick_params() 缺少 1 个必需的位置参数:'self'
- sql - 在 SQL Server 中使用插入语句优化必要的 while 循环
- prolog - 使用谓词解决序言中的 kakuro
- firebase - Firestore - 保存查询结果
- c++ - 返回指向结构元素的 char 指针
- php - 如何使用php将pdf转换为文本
- java - 无法在java中使用jython导入python模块
- r - 如何根据另一列中的索引操作一列中的子字符串
- javascript - 尽管有适当的 Access-Control-Allow-* 标头,但 CORS ajax 调用失败