diff --git a/xlsx.js b/xlsx.js
index ee626c3..294d37a 100644
--- a/xlsx.js
+++ b/xlsx.js
@@ -162,8 +162,8 @@ function parseProps(data) {
 		if(cur && cur.length > 0) q[f] = cur[1];
 	});
 
-	p["Worksheets"] = parseInt(q["HeadingPairs"].match(new RegExp("<vt:i4>(.*)<\/vt:i4>"))[1], 10); 
-	p["SheetNames"] = q["TitlesOfParts"].match(new RegExp("<vt:lpstr>([^<]*)<\/vt:lpstr>","g")).map(function(x){return x.match(new RegExp("<vt:lpstr>([^<]*)<\/vt:lpstr>"))[1];});
+	if(q["HeadingPairs"]) p["Worksheets"] = parseInt(q["HeadingPairs"].match(new RegExp("<vt:i4>(.*)<\/vt:i4>"))[1], 10); 
+	if(q["TitlesOfParts"]) p["SheetNames"] = q["TitlesOfParts"].match(new RegExp("<vt:lpstr>([^<]*)<\/vt:lpstr>","g")).map(function(x){return x.match(new RegExp("<vt:lpstr>([^<]*)<\/vt:lpstr>"))[1];});
 	p["Creator"] = q["dc:creator"];
 	p["LastModifiedBy"] = q["cp:lastModifiedBy"];
 	p["CreatedDate"] = new Date(q["dcterms:created"]);
@@ -222,7 +222,7 @@ function parseWB(data) {
 			case '<?xml': break;
 			case '<workbook': wb.xmlns = y.xmlns; break;
 			case '<fileVersion':
-				if(y.appName != "xl") throw "Unexpected workbook.appName: "+y.appName;
+				//if(y.appName != "xl") throw "Unexpected workbook.appName: "+y.appName;
 				delete y[0]; wb.AppVersion = y; break;
 			case '<workbookPr': delete y[0]; wb.WBProps = y; break;
 			case '<workbookPr/>': delete y[0]; wb.WBProps = y; break;
@@ -231,6 +231,7 @@ function parseWB(data) {
 			case '<sheets>': case '</sheets>': break; // aggregate sheet
 			case '<sheet': delete y[0]; wb.Sheets.push(y); break; 
 			case '</extLst>': case '</workbook>': break;
+			case '<workbookProtection/>': break; // LibreOffice 
 			case '<extLst>': break; 
 			case '<calcPr': delete y[0]; wb.CalcPr = y; break;
 			case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;