From 056fdb52a00afec361d6c84805f9b3f31499fc36 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 1 Jul 2025 18:14:50 -0400 Subject: [PATCH] Always return ExcelRowKind::Subrows in a subrow-enabled sheet See #14 --- src/exd.rs | 6 +++++- src/exd_file_operations.rs | 4 ++-- src/exh.rs | 17 ++++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/exd.rs b/src/exd.rs index 6ce3fe2..e4fb44e 100644 --- a/src/exd.rs +++ b/src/exd.rs @@ -200,6 +200,7 @@ impl ColumnData { } } +// TODO: Rename to ExcelRow #[derive(Debug, Clone, PartialEq)] pub struct ExcelSingleRow { pub columns: Vec, @@ -293,7 +294,7 @@ impl EXD { #[cfg(test)] mod tests { - use crate::exh::EXHHeader; + use crate::exh::{EXHHeader, SheetRowKind}; use std::fs::read; use std::path::PathBuf; @@ -314,6 +315,9 @@ mod tests { language_count: 0, row_count: 0, unk1: 0, + row_kind: SheetRowKind::SingleRow, + unk2: 0, + unk3: 0, }, column_definitions: vec![], pages: vec![], diff --git a/src/exd_file_operations.rs b/src/exd_file_operations.rs index c3dda9e..c4c4ddb 100644 --- a/src/exd_file_operations.rs +++ b/src/exd_file_operations.rs @@ -13,7 +13,7 @@ use crate::{ ColumnData, DataSection, DataSectionHeader, EXD, EXDHeader, ExcelDataOffset, ExcelRow, ExcelRowKind, ExcelSingleRow, SubRowHeader, }, - exh::{ColumnDataType, EXH, ExcelColumnDefinition}, + exh::{ColumnDataType, EXH, ExcelColumnDefinition, SheetRowKind}, }; #[binrw::parser(reader)] @@ -65,7 +65,7 @@ pub fn parse_rows(exh: &EXH, data_offsets: &Vec) -> BinResult 1 { + let new_row = if exh.header.row_kind == SheetRowKind::SubRows { let mut rows = Vec::new(); for i in 0..row_header.row_count { let subrow_offset = data_offset + i as u64 * (2 + exh.header.row_size as u64); diff --git a/src/exh.rs b/src/exh.rs index ef564e2..1a7a691 100644 --- a/src/exh.rs +++ b/src/exh.rs @@ -15,6 +15,14 @@ use crate::ByteBuffer; use crate::ByteSpan; use crate::common::Language; +#[binrw] +#[derive(Debug, PartialEq, Eq)] +#[brw(repr = u8)] +pub enum SheetRowKind { + SingleRow = 1, + SubRows = 2, +} + #[binrw] #[brw(magic = b"EXHF")] #[brw(big)] @@ -30,9 +38,12 @@ pub struct EXHHeader { /// Usually 0 pub unk1: u16, - #[br(temp)] - #[bw(calc = 0x010000)] // always this value?? - pub unk2: u32, + pub unk2: u8, + + /// Whether this Excel sheet uses subrows or just single rows. + pub row_kind: SheetRowKind, + + pub unk3: u16, #[brw(pad_after = 8)] // padding pub row_count: u32,