diff --git a/plugins/excel/ms-excel-write.c b/plugins/excel/ms-excel-write.c
index 62494e7..fca6528 100644
--- a/plugins/excel/ms-excel-write.c
+++ b/plugins/excel/ms-excel-write.c
@@ -300,7 +300,7 @@ excel_write_string (BiffPut *bp, WriteStringFlags flags,
 		    guint8 const *txt)
 {
 	size_t byte_len, out_bytes, offset = 0;
-	unsigned int char_len, output_len;
+	unsigned int char_len, output_len, avail;
 	char *in_bytes = (char *)txt; /* bloody strict-aliasing is broken */
 
 	g_return_val_if_fail (txt != NULL, 0);
@@ -384,11 +384,23 @@ excel_write_string (BiffPut *bp, WriteStringFlags flags,
 			tmp += 4;
 			break;
 		}
-		if (bp->version >= MS_BIFF_V8 && !(flags & STR_SUPPRESS_HEADER))
-			*tmp++ = 0;	/* flag as not unicode */
-		ms_biff_put_var_write (bp, bp->buf, tmp - bp->buf);
-		ms_biff_put_var_write (bp, txt, char_len);
-		out_bytes = char_len + tmp - bp->buf;
+		out_bytes =  tmp - bp->buf;
+		ms_biff_put_var_write (bp, bp->buf, out_bytes);
+		avail = ms_biff_max_record_len (bp) - out_bytes;
+		do {
+			if (bp->version >= MS_BIFF_V8 && !(flags & STR_SUPPRESS_HEADER)) {
+				*tmp++ = 0;	/* flag as not unicode */ /* Jean: MS docs say uncompressed */
+				avail--;
+				out_bytes++;
+				ms_biff_put_var_write (bp, "\0", 1);
+			}
+			avail = MIN (avail, char_len);
+			ms_biff_put_var_write (bp, txt, avail);
+			out_bytes += avail;
+			char_len -= avail;
+			txt += avail;
+			avail = ms_biff_max_record_len (bp);
+		} while (char_len > 0);
 	}
 
 	return out_bytes;
